From 3467aabbe412a3d2a081c9bb1e4666284a65ceb4 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Sat, 17 Jun 2023 14:27:27 +0100 Subject: [PATCH] chore(ssa refactor): SSA refactor main (#1628) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * disable mac tests * feat: added support for modulo ops on brillig (#1621) * feat: added support for modulo ops * chore: use ACVM 0.14.3 * revert change as its unrelated * small comment refactor --------- Co-authored-by: kevaundray * feat(brillig): foreign call/oracle compilation (#1600) * remove mac runner * chore: generate brillig opcode for simple identity unconstrained function (#1536) * feat(brillig): added arithmetic operations on brillig (#1565) Co-authored-by: kevaundray * make ranges be polymorphic integers * chore(brillig): Clean up handling of Binary operations (#1571) * chore(ssa refactor): Rename Brillig example (#1563) * chore(brillig): added tests for all field binary operations (#1586) * chore(brillig): added tests for brillig integer operations (#1590) * feat: process blocks and jumps when compiling brillig (#1591) * process jumps between blocks * fix jumps * add doc comments * cargo fmt * code refactor * update code comment --------- Co-authored-by: kevaundray * feat: process blocks and jumps when compiling brillig (#1591) * process jumps between blocks * fix jumps * add doc comments * cargo fmt * code refactor * update code comment --------- Co-authored-by: kevaundray * feat(brillig): start of oracles/foreign calls * fix: broken tests * feat(brillig): parsing oracles/foreign calls (#1596) * feat(brillig): start of oracles/foreign calls * fix: broken tests * Update execute.rs * feat: more foreign call work * self.data -> self.vars * chore(brillig): Add handling of the not instruction (#1609) * test: brillig oracle * Reinstate option * make behavior consistent * remove closure * change index_type * Update crates/noirc_frontend/src/hir/type_check/expr.rs * feat(brillig): loops (#1610) * make ranges be polymorphic integers * feat: brillig loop support * fix: fixed brillig returns and stop * fix: do not apply constants folding to brillig fns * chore: update acvm pointer, cleanup * style: newline on cargo toml * make behavior consistent * remove closure * change index_type * Update crates/noirc_frontend/src/hir/type_check/expr.rs * better debug information for unsupported instruction * remove edge case for optimizations * clippy fix * patch infinite loop --------- Co-authored-by: kevaundray Co-authored-by: jfecher * feat: Foreign calls compiling and basic print executed in nargo (#1612) * get foreign calls compiling and basic print executed in nargo * cargo clipy and cargo fmt * missing * Update crates/noirc_evaluator/src/brillig/brillig_gen.rs * add issue num for logging --------- Co-authored-by: kevaundray * chore: resolve immutable array merge differences (#1617) * chore(ssa refactor): Switch to immutable arrays (#1578) * Represent SSA arrays with im::Vector * Get tests passing * Implement assign with immutable arrays * Add constant folding pass * Update comments * Clippy * Update comment * Update type of array * Update crates/noirc_evaluator/src/ssa_refactor/ir/instruction.rs Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> * Undo formatting changes in instruction.rs * Massive acir_gen update * Refactor acir array operations into a shared function * Appease clippy * Update to_radix and to_bits in acir_gen to return arrays * Disable assert * Fix convert_type for arrays * Include AcirType in AcirValue::Var variant * Fix black box functions * Appease clippy * Fix simple_radix * Add doc comments --------- Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> * feat: Make for-loop range be a polymorphic integer instead of just Field in unconstrained functions (#1583) * make ranges be polymorphic integers * make behavior consistent * remove closure * change index_type * Update crates/noirc_frontend/src/hir/type_check/expr.rs --------- Co-authored-by: jfecher * chore(ssa refactor): fix brillig post master merge * chore(ssa refactor): accidental merge undelete --------- Co-authored-by: jfecher Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> Co-authored-by: kevaundray * chore(ssa refactor): Add more documentation for truncation (#1607) * add more documentation * small change * Update crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/generated_acir.rs * Update .github/workflows/test.yml * Update .github/workflows/test.yml * remove dbg * change printer for foreign call * Update crates/noirc_evaluator/src/ssa_refactor/ir/function.rs * Update crates/noirc_evaluator/src/ssa_refactor/ir/instruction.rs Co-authored-by: kevaundray * Update crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/acir_variable.rs --------- Co-authored-by: kevaundray Co-authored-by: guipublic <47281315+guipublic@users.noreply.github.com> Co-authored-by: Álvaro Rodríguez Co-authored-by: jfecher Co-authored-by: Maxim Vezenov Co-authored-by: joss-aztec <94053499+joss-aztec@users.noreply.github.com> Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> * feat: add support for assert in brillig (#1603) * remove mac runner * chore: generate brillig opcode for simple identity unconstrained function (#1536) * feat(brillig): added arithmetic operations on brillig (#1565) Co-authored-by: kevaundray * make ranges be polymorphic integers * chore(brillig): Clean up handling of Binary operations (#1571) * chore(ssa refactor): Rename Brillig example (#1563) * chore(brillig): added tests for all field binary operations (#1586) * chore(brillig): added tests for brillig integer operations (#1590) * feat: process blocks and jumps when compiling brillig (#1591) * process jumps between blocks * fix jumps * add doc comments * cargo fmt * code refactor * update code comment --------- Co-authored-by: kevaundray * feat: process blocks and jumps when compiling brillig (#1591) * process jumps between blocks * fix jumps * add doc comments * cargo fmt * code refactor * update code comment --------- Co-authored-by: kevaundray * feat(brillig): parsing oracles/foreign calls (#1596) * feat(brillig): start of oracles/foreign calls * fix: broken tests * Update execute.rs * support assert in brillig * self.data -> self.vars * Avoid not in the test * chore(brillig): Add handling of the not instruction (#1609) * make behavior consistent * remove closure * change index_type * Update crates/noirc_frontend/src/hir/type_check/expr.rs * feat(brillig): loops (#1610) * make ranges be polymorphic integers * feat: brillig loop support * fix: fixed brillig returns and stop * fix: do not apply constants folding to brillig fns * chore: update acvm pointer, cleanup * style: newline on cargo toml * make behavior consistent * remove closure * change index_type * Update crates/noirc_frontend/src/hir/type_check/expr.rs * better debug information for unsupported instruction * remove edge case for optimizations * clippy fix * patch infinite loop --------- Co-authored-by: kevaundray Co-authored-by: jfecher * chore: resolve immutable array merge differences (#1617) * chore(ssa refactor): Switch to immutable arrays (#1578) * Represent SSA arrays with im::Vector * Get tests passing * Implement assign with immutable arrays * Add constant folding pass * Update comments * Clippy * Update comment * Update type of array * Update crates/noirc_evaluator/src/ssa_refactor/ir/instruction.rs Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> * Undo formatting changes in instruction.rs * Massive acir_gen update * Refactor acir array operations into a shared function * Appease clippy * Update to_radix and to_bits in acir_gen to return arrays * Disable assert * Fix convert_type for arrays * Include AcirType in AcirValue::Var variant * Fix black box functions * Appease clippy * Fix simple_radix * Add doc comments --------- Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> * feat: Make for-loop range be a polymorphic integer instead of just Field in unconstrained functions (#1583) * make ranges be polymorphic integers * make behavior consistent * remove closure * change index_type * Update crates/noirc_frontend/src/hir/type_check/expr.rs --------- Co-authored-by: jfecher * chore(ssa refactor): fix brillig post master merge * chore(ssa refactor): accidental merge undelete --------- Co-authored-by: jfecher Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> Co-authored-by: kevaundray * chore(ssa refactor): Add more documentation for truncation (#1607) * add more documentation * small change * Update crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/generated_acir.rs * Update .github/workflows/test.yml * Update .github/workflows/test.yml * Remove optimisation for handling assert * add the assert jump to the list of jumps to fix * add doc comment --------- Co-authored-by: kevaundray Co-authored-by: Álvaro Rodríguez Co-authored-by: ludamad Co-authored-by: jfecher Co-authored-by: joss-aztec <94053499+joss-aztec@users.noreply.github.com> Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> * chore(ssa refactor): Separate Brillig only logic from Brillig-SSA generation logic (#1631) * separate brillig only logic from logic that combines both brillig and ssa * move operations related to brillig-ssa conversion to brillig_gen * intermediate step -- make build work by leaking the abstraction * refactor return instruction -- all of the implementation details about brillig are no longer in brillig_gen * fix clippy * add TODO * move `convert_integer_mod` into BrilligIr * encapsulate modulo operation in brillig_gen * process binary instruction * refactor const instruction * make code surrounding jumps satisfy the abstraction * move not instruction * add foreign call instruction * move load and store instructions to brillig_ir * move truncate instruction * move `mov`, `stop` and `allocate_array` methods * fix clippy * remove push_code method in brillig_gen * move jump and jmpif instructions to brillig_ir * clean up terminator instruction * remove allow(deprecated) lint * refactor document for link and link_with * use .into so we can get rid of Value import * add docs * Update crates/noirc_evaluator/src/brillig/brillig_ir/artifact.rs Co-authored-by: Álvaro Rodríguez * Update crates/noirc_evaluator/src/brillig/brillig_gen.rs * make code a bit clearer * fix clippy --------- Co-authored-by: Álvaro Rodríguez * chore(ssa_refactor): Improve foreign call compilation (#1644) * remove ForeignCall instruction from SSA * remove unnecessary Oracle RuntimeType * remove old comment * feat: Brillig array inputs and outputs (#1630) * first attempt at brillig multiple array inptus * working array identity function for brillig * cleanup dbgs * remove unused imports * remove dbg * a little cleanup * fix up foreign calls for array inputs and outputs * fix outputs clippy err * move conversion to RegisterValueOrArray to its own method * missing &mut and TODO link * PR comment for brillig output array types * cleanup comment * enable struct inputs/outputs * cargo clippy * chore(brillig): master into brillig main (#1663) * fix(ssa refactor): resolve replaced value ids for printing (#1535) * fix(ssa refactor): resolve replaced value ids for printing * fix(ssa refactor): Expand PR #1535 to resolve ValueIds in all SSA passes (#1642) * Expand PR * chore(ssa refactor): more value id resolving * chore(ssa refactor): another value id resolve --------- Co-authored-by: Joss --------- Co-authored-by: jfecher * chore(ssa refactor): enable_side_effects instruction (#1547) * chore(ssa refactor): enable_side_effects instruction * chore(ssa refactor): fix and document enable_side_effects insertions * chore(ssa refactor): rm comments * fix(ssa refactor): redundant EnableSideEffects * chore(ssa refactor): cp working tests (#1619) * chore(ssa gen): ssa gen truncate instruction * chore(ssa refactor): max bit size for subtract * Update crates/noirc_evaluator/src/ssa_refactor/ssa_gen/context.rs Co-authored-by: jfecher * chore(ssa refactor): truncate shift left * chore(ssa refactor): Add integer modulus when truncating subtraction * chore(ssa refactor): clippy * chore(ssa refactor): fix left shift max bit size * chore(ssa refactor): cp xor test * chore(ssa refactor): cp working tests * chore(ssa refactor): more working tests * chore(ssa refactor): cp working test --------- Co-authored-by: kevaundray Co-authored-by: jfecher * chore(ssa refactor): Remove unit values from SSA IR (#1646) * Remove unit values * Fix test * Fix comment * chore: Upgrade codespan dependencies (#1647) * chore(ssa refactor): Implement dead instruction elimination pass (#1595) * Add dead instruction elimination pass * Enable the pass * chore(ssa refactor): simple mut test * chore(ssa refactor): fixup and add doc comments * chore(ssa refactor): post merge fix --------- Co-authored-by: Joss * chore(brillig): Update acvm dependency (#1653) chore: update acvm dep * refactor: remove unused assign --------- Co-authored-by: joss-aztec <94053499+joss-aztec@users.noreply.github.com> Co-authored-by: jfecher Co-authored-by: kevaundray Co-authored-by: Blaine Bublitz Co-authored-by: Joss * feat(brillig): Added cast instruction (#1649) * feat: added cast instruction * docs: add comment on cast * docs: added comment on cast instruction * simplify convert_cast * Alvaro to review * feat: do casts as no ops instead --------- Co-authored-by: kevaundray * feat(brillig): Add unique labeling and remove relative jumps (#1652) * feat: added unique labeling * refactor: remove relative jumps * feat: add section/global labeling * pr review * Update crates/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs * style: clippy --------- Co-authored-by: kevaundray * fix `is_signed` method * feat(brillig): added basic array operations (#1716) * feat: added array operations * docs: commented functions a bit * Update crates/noirc_evaluator/src/brillig/brillig_ir.rs * refactor: rename method * refactor: simplify size calculations * style: fmt * feat(brillig): runtime memory allocation (#1732) * feat: use dynamic memory allocation * docs: update comments * refactor: rename allocation methods * docs: updated comment * refactor: changes from peer review * chore(brillig): Add a register abstraction/optimization (#1737) * chore: brillig register abstraction * chore: small refactor * fix: latest_register starting value * fix: comments * chore: remove unused method * fix: reintroduce a safety register alloc check * merge fix: AcirType is now an enum * merge fix: foreign calls * fix: Oracle output resolution (#1740) silly fix until we use enums for foreign call results --------- Co-authored-by: Álvaro Rodríguez Co-authored-by: ludamad Co-authored-by: guipublic <47281315+guipublic@users.noreply.github.com> Co-authored-by: jfecher Co-authored-by: Maxim Vezenov Co-authored-by: joss-aztec <94053499+joss-aztec@users.noreply.github.com> Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com> Co-authored-by: Blaine Bublitz Co-authored-by: Joss --- .gitignore | 1 + crates/nargo/src/ops/execute.rs | 54 +- .../brillig_arrays/Nargo.toml | 5 + .../brillig_arrays/Prover.toml | 1 + .../brillig_arrays/src/main.nr | 29 + .../brillig_assert/Nargo.toml | 5 + .../brillig_assert/Prover.toml | 1 + .../brillig_assert/src/main.nr | 11 + .../brillig_assert_fail/Nargo.toml | 5 + .../brillig_assert_fail/Prover.toml | 1 + .../brillig_assert_fail/src/main.nr | 11 + .../brillig_cast/Nargo.toml | 5 + .../brillig_cast/Prover.toml | 0 .../brillig_cast/src/main.nr | 50 ++ .../brillig_identity_function/src/main.nr | 25 + .../brillig_identity_function/target/c.json | 1 + .../brillig_modulo/Nargo.toml | 5 + .../brillig_modulo/Prover.toml | 0 .../brillig_modulo/src/main.nr | 28 + .../brillig_oracle/Nargo.toml | 5 + .../brillig_oracle/Prover.toml | 2 + .../brillig_oracle/src/main.nr | 24 + .../tests/test_data_ssa_refactor/config.toml | 2 +- .../noirc_evaluator/src/brillig/artifact.rs | 98 ---- crates/noirc_evaluator/src/brillig/binary.rs | 106 ---- .../src/brillig/brillig_gen.rs | 343 +---------- .../src/brillig/brillig_gen/brillig_block.rs | 511 ++++++++++++++++ .../src/brillig/brillig_gen/brillig_fn.rs | 41 ++ .../noirc_evaluator/src/brillig/brillig_ir.rs | 555 ++++++++++++++++++ .../src/brillig/brillig_ir/artifact.rs | 147 +++++ .../src/brillig/brillig_ir/registers.rs | 59 ++ crates/noirc_evaluator/src/brillig/memory.rs | 15 - crates/noirc_evaluator/src/brillig/mod.rs | 13 +- crates/noirc_evaluator/src/ssa/ssa_gen.rs | 8 +- .../acir_gen/acir_ir/acir_variable.rs | 114 +++- .../src/ssa_refactor/acir_gen/mod.rs | 32 +- .../src/ssa_refactor/ir/dfg.rs | 13 + .../src/ssa_refactor/ir/function.rs | 4 +- .../src/ssa_refactor/ir/map.rs | 6 + .../src/ssa_refactor/ir/printer.rs | 4 +- .../src/ssa_refactor/ir/value.rs | 6 + .../src/ssa_refactor/opt/inlining.rs | 3 + .../src/ssa_refactor/ssa_builder/mod.rs | 8 +- .../src/ssa_refactor/ssa_gen/mod.rs | 17 +- .../src/ssa_refactor/ssa_gen/value.rs | 2 +- .../src/hir/resolution/resolver.rs | 1 - .../src/monomorphization/ast.rs | 2 +- .../src/monomorphization/mod.rs | 4 +- .../src/monomorphization/printer.rs | 2 +- 49 files changed, 1777 insertions(+), 608 deletions(-) create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Prover.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/src/main.nr create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Prover.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/src/main.nr create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Prover.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/src/main.nr create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Prover.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/src/main.nr create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/target/c.json create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Prover.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/src/main.nr create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Nargo.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Prover.toml create mode 100644 crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/src/main.nr delete mode 100644 crates/noirc_evaluator/src/brillig/artifact.rs delete mode 100644 crates/noirc_evaluator/src/brillig/binary.rs create mode 100644 crates/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs create mode 100644 crates/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs create mode 100644 crates/noirc_evaluator/src/brillig/brillig_ir.rs create mode 100644 crates/noirc_evaluator/src/brillig/brillig_ir/artifact.rs create mode 100644 crates/noirc_evaluator/src/brillig/brillig_ir/registers.rs delete mode 100644 crates/noirc_evaluator/src/brillig/memory.rs diff --git a/.gitignore b/.gitignore index 9684106d30c..b6fa54b3c17 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ result *.pk *.vk **/Verifier.toml +**/target diff --git a/crates/nargo/src/ops/execute.rs b/crates/nargo/src/ops/execute.rs index 36cbe19a82e..d63ae45d3d8 100644 --- a/crates/nargo/src/ops/execute.rs +++ b/crates/nargo/src/ops/execute.rs @@ -1,4 +1,6 @@ -use acvm::pwg::{solve, Blocks, PartialWitnessGeneratorStatus}; +use acvm::acir::brillig_vm::ForeignCallResult; +use acvm::acir::circuit::Opcode; +use acvm::pwg::{solve, Blocks, PartialWitnessGeneratorStatus, UnresolvedBrilligCall}; use acvm::PartialWitnessGenerator; use acvm::{acir::circuit::Circuit, acir::native_types::WitnessMap}; @@ -11,8 +13,54 @@ pub fn execute_circuit( ) -> Result { let mut blocks = Blocks::default(); let solver_status = solve(backend, &mut initial_witness, &mut blocks, circuit.opcodes)?; - if matches!(solver_status, PartialWitnessGeneratorStatus::RequiresOracleData { .. }) { - todo!("Add oracle support to nargo execute") + + // TODO(#1615): Nargo only supports "oracle_print_**_impl" functions that print a singular value or an array and nothing else + // This should be expanded in a general logging refactor + if let PartialWitnessGeneratorStatus::RequiresOracleData { + unresolved_brillig_calls, + required_oracle_data, + unsolved_opcodes, + } = solver_status + { + if !required_oracle_data.is_empty() { + unreachable!("oracles are not supported by nargo execute") + } + for unresolved_brillig_call in unresolved_brillig_calls { + let UnresolvedBrilligCall { foreign_call_wait_info, mut brillig } = + unresolved_brillig_call; + + // Execute foreign calls + // TODO(#1615): "oracle_print_impl" and "oracle_print_array_impl" are just identity funcs + if foreign_call_wait_info.function == "oracle_print_impl" { + let values = &foreign_call_wait_info.inputs[0]; + println!("{:?}", values[0].to_field().to_hex()); + brillig.foreign_call_results.push(ForeignCallResult { + values: vec![vec![foreign_call_wait_info.inputs[0][0]]], + }); + } else if foreign_call_wait_info.function == "oracle_print_array_impl" { + let mut outputs_hex = Vec::new(); + for value in foreign_call_wait_info.inputs.clone() { + outputs_hex.push(value[0].to_field().to_hex()); + } + // Join all of the hex strings using a comma + let comma_separated_elements = outputs_hex.join(", "); + let output_witnesses_string = "[".to_owned() + &comma_separated_elements + "]"; + println!("{output_witnesses_string}"); + brillig.foreign_call_results.push(ForeignCallResult { + values: vec![vec![foreign_call_wait_info.inputs[0][0]]], + }); + } + + let mut next_opcodes_for_solving = vec![Opcode::Brillig(brillig)]; + next_opcodes_for_solving.extend_from_slice(&unsolved_opcodes[..]); + + let solver_status = + solve(backend, &mut initial_witness, &mut blocks, next_opcodes_for_solving)?; + if matches!(solver_status, PartialWitnessGeneratorStatus::RequiresOracleData { .. }) { + todo!("Add multiple foreign call support to nargo execute") + // TODO 1557 + } + } } Ok(initial_witness) diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Nargo.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Nargo.toml new file mode 100644 index 00000000000..e0b467ce5da --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Nargo.toml @@ -0,0 +1,5 @@ +[package] +authors = [""] +compiler_version = "0.1" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Prover.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Prover.toml new file mode 100644 index 00000000000..6371ea2b28b --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/Prover.toml @@ -0,0 +1 @@ +x = ["1", "2", "3"] diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/src/main.nr new file mode 100644 index 00000000000..a2b64100918 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_arrays/src/main.nr @@ -0,0 +1,29 @@ +// Tests a very simple program. +// +// The features being tested are array reads and writes + +fn main(x: [Field; 3]) { + read_array(x); + read_write_array(x); +} + +unconstrained fn read_array(x: [Field; 3]) { + assert(x[0] == 1); + let y = [1, 5, 27]; + + assert(y[x[0]] == 5); +} + +unconstrained fn read_write_array(x: [Field; 3]) { + let mut y = x; + + y[0] = 5; + + assert(y[0] == 5); + assert(y[1] == 2); + assert(y[2] == 3); + + assert(x[0] == 1); + assert(x[1] == 2); + assert(x[2] == 3); +} diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Nargo.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Nargo.toml new file mode 100644 index 00000000000..e0b467ce5da --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Nargo.toml @@ -0,0 +1,5 @@ +[package] +authors = [""] +compiler_version = "0.1" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Prover.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Prover.toml new file mode 100644 index 00000000000..4dd6b405159 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/Prover.toml @@ -0,0 +1 @@ +x = "1" diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/src/main.nr new file mode 100644 index 00000000000..320369c7b67 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert/src/main.nr @@ -0,0 +1,11 @@ +// Tests a very simple program. +// +// The features being tested is using assert on brillig +fn main(x: Field) { + assert(1 == conditional(x as bool)); +} + +unconstrained fn conditional(x : bool) -> Field { + assert(x); + 1 +} \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Nargo.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Nargo.toml new file mode 100644 index 00000000000..e0b467ce5da --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Nargo.toml @@ -0,0 +1,5 @@ +[package] +authors = [""] +compiler_version = "0.1" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Prover.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Prover.toml new file mode 100644 index 00000000000..11497a473bc --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/Prover.toml @@ -0,0 +1 @@ +x = "0" diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/src/main.nr new file mode 100644 index 00000000000..320369c7b67 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_assert_fail/src/main.nr @@ -0,0 +1,11 @@ +// Tests a very simple program. +// +// The features being tested is using assert on brillig +fn main(x: Field) { + assert(1 == conditional(x as bool)); +} + +unconstrained fn conditional(x : bool) -> Field { + assert(x); + 1 +} \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Nargo.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Nargo.toml new file mode 100644 index 00000000000..e0b467ce5da --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Nargo.toml @@ -0,0 +1,5 @@ +[package] +authors = [""] +compiler_version = "0.1" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Prover.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/Prover.toml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/src/main.nr new file mode 100644 index 00000000000..e258a8f2640 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_cast/src/main.nr @@ -0,0 +1,50 @@ +// Tests a very simple Brillig function. +// +// The features being tested are cast operations on brillig +fn main() { + bool_casts(); + field_casts(); + uint_casts(); + int_casts(); + mixed_casts(); +} + +unconstrained fn bool_casts() { + assert(false == 0 as bool); + assert(true == 1 as bool); + assert(true == 3 as bool); +} + +unconstrained fn field_casts() { + assert(5 as u8 as Field == 5); + assert(16 as u4 as Field == 0); +} + +unconstrained fn uint_casts() { + let x: u32 = 100; + assert(x as u2 == 0); + assert(x as u4 == 4); + assert(x as u6 == 36); + assert(x as u8 == 100); + assert(x as u64 == 100); + assert(x as u126 == 100); +} + +unconstrained fn int_casts() { + let x: i32 = 100; + assert(x as i2 == 0); + assert(x as i4 == 4); + assert(x as i6 == -28 as i6); + assert(x as i8 == 100); + assert(x as i8 == 100); + assert(x as i8 == 100); +} + + +unconstrained fn mixed_casts() { + assert(100 as u32 as i32 as u32 == 100); + assert(13 as u4 as i2 as u32 == 1); + assert(15 as u4 as i2 as u32 == 3); + assert(1 as u8 as bool == true); + assert(true as i8 == 1); +} diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/src/main.nr index cb6ce1ae2f4..5ad4e913e92 100644 --- a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/src/main.nr +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/src/main.nr @@ -1,10 +1,35 @@ +use dep::std; + +struct myStruct { + foo: Field, + foo_arr: [Field; 2], +} + // Tests a very simple program. // // The features being tested is the identity function in Brillig fn main(x : Field) { assert(x == identity(x)); + // TODO: add support for array comparison + let arr = identity_array([x, x]); + assert(x == arr[0]); + assert(x == arr[1]); + + let s = myStruct { foo: x, foo_arr: [x, x] }; + let identity_struct = identity_struct(s); + assert(x == identity_struct.foo); + assert(x == identity_struct.foo_arr[0]); + assert(x == identity_struct.foo_arr[1]); } unconstrained fn identity(x : Field) -> Field { x +} + +unconstrained fn identity_array(arr : [Field; 2]) -> [Field; 2] { + arr +} + +unconstrained fn identity_struct(s : myStruct) -> myStruct { + s } \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/target/c.json b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/target/c.json new file mode 100644 index 00000000000..09089ad1fa0 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_identity_function/target/c.json @@ -0,0 +1 @@ +{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"x","type":{"kind":"field"},"visibility":"private"}],"param_witnesses":{"x":[1]},"return_type":null,"return_witnesses":[]},"bytecode":[213,148,77,78,195,48,16,133,67,211,150,180,92,198,142,237,198,222,241,183,97,193,170,39,32,197,45,150,210,164,10,86,246,190,129,99,195,142,29,80,4,167,224,26,220,6,132,40,82,215,30,36,227,149,87,79,51,223,188,247,238,142,30,204,203,105,171,170,74,173,238,123,179,157,171,122,85,73,111,123,247,113,140,194,30,62,8,150,64,223,19,173,55,149,28,88,103,30,47,155,206,37,201,211,92,55,155,119,243,118,210,42,125,179,150,90,45,188,245,16,227,126,105,16,52,163,84,22,185,196,4,95,161,92,148,156,33,202,202,25,199,28,51,206,174,115,78,136,228,148,23,162,20,5,18,152,18,137,151,76,144,229,143,200,0,64,35,13,199,102,94,207,85,43,23,90,117,210,108,47,234,78,182,218,165,195,61,100,189,15,39,150,14,33,108,50,10,71,6,191,217,200,2,92,97,207,162,177,160,250,77,187,139,46,237,209,13,228,118,245,51,222,125,14,173,55,207,103,77,125,171,93,210,3,108,252,15,58,109,12,160,145,253,77,167,101,19,240,228,103,19,8,239,77,35,236,180,108,26,101,167,1,160,178,246,19],"proving_key":[0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,69,0,0,0,3,113,95,49,0,0,0,16,254,255,255,31,216,20,60,120,221,30,141,12,111,47,152,175,69,79,253,252,146,116,95,143,172,191,156,61,26,99,55,31,128,225,166,19,57,49,226,241,25,0,192,25,68,134,248,118,168,148,147,77,202,252,253,191,232,34,128,93,159,247,134,11,76,135,16,63,22,220,90,11,47,238,136,127,221,224,11,208,111,8,212,89,138,92,85,171,215,86,38,230,32,230,222,31,153,33,17,244,110,182,83,120,134,226,119,20,11,135,137,123,161,100,228,245,184,170,239,230,246,84,3,136,168,13,61,27,248,206,237,196,3,251,75,41,174,251,100,247,192,65,80,218,6,170,55,30,58,230,35,74,112,242,201,88,196,129,110,17,96,38,159,136,213,223,121,213,54,117,35,89,161,79,59,216,138,170,79,239,53,218,90,140,178,58,7,148,89,158,24,43,67,130,113,165,31,169,220,202,57,163,114,96,117,84,13,60,219,59,7,119,225,98,253,63,194,166,143,84,101,143,134,15,107,124,191,58,95,120,167,216,11,221,18,255,243,153,72,60,90,224,46,241,29,149,154,104,198,48,50,19,159,157,25,14,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,16,144,128,125,98,191,216,133,187,137,8,118,247,57,246,102,212,73,23,253,117,193,54,186,171,54,248,235,240,215,4,156,49,180,120,239,192,233,35,165,244,208,17,119,128,34,31,244,47,144,247,43,166,117,163,170,84,40,169,217,25,223,25,33,0,89,124,202,117,192,42,8,98,248,245,196,205,7,205,126,137,38,160,141,73,40,173,248,29,61,208,243,235,197,146,104,8,7,49,18,75,104,15,210,146,192,147,225,142,246,213,123,253,155,253,70,96,15,212,139,253,101,109,4,198,200,47,45,30,176,59,133,237,34,42,238,215,108,147,18,184,220,44,36,115,103,1,65,212,85,89,93,223,108,224,100,186,29,94,10,18,189,125,142,90,224,86,35,53,198,92,141,159,138,171,242,195,36,196,248,136,30,157,2,192,61,89,112,171,154,112,121,16,135,33,28,47,208,104,180,1,115,251,41,227,30,186,191,200,109,36,67,78,195,194,77,156,109,244,196,96,207,2,140,21,0,0,0,7,113,95,49,95,102,102,116,0,0,0,68,33,185,35,19,211,157,207,139,200,46,221,191,180,55,39,213,48,163,198,132,183,226,65,68,111,162,151,156,210,60,242,13,148,91,186,43,24,55,242,122,66,221,229,167,113,20,234,13,143,145,118,167,100,213,71,238,124,57,101,183,220,182,200,67,120,63,57,25,70,66,110,174,121,229,156,239,77,134,12,201,125,213,220,253,186,105,169,13,98,30,193,173,124,67,58,33,53,115,110,187,211,17,50,156,69,228,249,17,68,21,237,84,139,99,114,224,156,55,94,27,79,187,184,165,141,60,53,42,86,126,164,210,4,9,76,201,0,65,178,27,107,212,0,26,53,227,74,231,54,96,211,189,197,121,183,105,97,124,105,11,176,0,98,20,159,190,180,71,33,186,83,132,202,105,144,22,49,166,5,77,178,185,111,48,200,157,111,93,250,235,165,19,126,89,119,45,5,136,54,245,228,23,192,144,107,190,48,75,79,33,98,25,34,253,246,31,37,177,64,11,227,95,220,15,240,192,118,220,113,6,8,240,84,115,105,170,23,175,16,225,100,62,50,233,71,41,46,128,5,211,142,82,1,222,250,63,81,249,197,143,108,138,117,169,78,95,135,155,0,65,66,53,191,243,148,232,57,153,192,159,213,189,87,93,89,121,82,19,198,28,172,188,160,31,140,137,31,130,117,233,8,20,115,214,158,22,53,68,18,112,202,179,120,62,74,188,133,123,215,85,180,248,189,188,200,46,239,162,59,142,45,158,128,83,231,100,120,28,204,98,79,188,151,231,20,37,147,136,97,188,61,17,91,4,18,179,71,17,99,84,228,123,163,9,155,135,21,246,38,98,86,225,240,22,243,42,134,6,140,81,67,118,31,63,224,200,32,138,139,111,243,208,47,46,106,197,218,2,198,165,189,38,80,57,97,164,255,22,144,169,45,210,70,201,253,22,50,19,98,42,9,255,76,28,187,215,10,61,43,221,32,133,236,130,161,57,8,111,57,100,71,2,205,105,51,31,30,8,71,137,7,213,86,39,99,44,161,208,185,167,85,60,165,17,24,230,255,39,200,70,58,56,129,143,120,178,153,43,115,77,235,141,164,123,121,7,142,182,146,137,229,85,213,15,209,175,216,149,25,101,163,85,145,194,106,31,125,40,192,15,171,58,100,27,58,246,109,72,77,237,152,140,229,245,159,171,33,10,106,10,130,121,165,31,239,39,252,211,103,1,94,151,149,14,59,242,5,129,116,218,122,232,164,34,128,49,59,94,24,66,241,147,202,70,29,97,187,111,172,57,91,53,210,63,94,53,104,164,32,46,180,78,172,149,112,88,88,21,254,219,63,192,242,196,129,56,232,178,230,212,64,57,25,67,50,45,21,33,227,254,214,108,119,60,103,253,163,178,37,239,6,134,93,231,22,143,0,229,16,240,215,176,156,39,27,163,53,224,193,11,93,226,151,235,173,250,204,41,5,113,57,201,77,171,24,22,141,79,202,226,164,172,13,157,9,38,180,204,221,222,80,60,233,93,210,15,64,87,53,123,55,114,75,95,56,255,215,108,242,34,148,253,209,250,124,26,217,254,249,218,64,59,158,6,118,119,162,21,51,12,98,172,179,124,12,158,122,2,49,9,181,173,243,235,60,124,199,150,185,179,105,23,93,190,134,21,142,226,57,155,132,1,94,158,219,148,121,241,17,180,147,148,236,212,178,145,255,135,9,179,245,216,182,129,115,194,162,37,165,205,139,74,177,207,250,245,7,38,91,182,128,117,253,18,33,158,72,145,185,238,190,228,6,61,211,37,196,220,223,76,206,81,47,33,165,105,42,199,234,38,13,27,149,128,249,110,63,144,224,254,45,177,66,166,74,73,3,96,100,54,9,56,107,46,139,119,226,188,195,17,28,81,168,98,3,14,65,226,102,250,102,200,39,88,230,52,109,77,225,86,1,238,194,85,131,22,25,37,210,226,95,81,148,198,28,219,139,57,201,123,126,224,36,200,192,223,113,141,224,163,195,81,122,132,72,16,53,54,240,143,35,54,79,193,152,95,166,68,144,76,122,241,212,20,254,60,244,10,58,209,140,115,196,206,69,91,227,79,184,118,219,0,14,223,0,136,32,171,196,244,135,60,232,86,62,132,27,152,13,80,229,50,201,16,73,126,220,3,6,88,130,172,66,32,8,51,143,222,45,124,229,133,186,66,99,131,239,163,113,147,193,32,205,202,122,206,221,241,63,253,184,56,57,77,150,4,201,85,138,29,9,236,36,8,132,165,159,128,149,96,208,107,32,11,128,249,74,188,105,142,87,253,224,15,135,104,199,210,120,101,47,225,151,0,242,186,118,152,66,188,111,95,249,158,131,30,79,193,139,226,87,187,49,245,27,5,184,197,86,213,60,125,117,52,186,140,4,43,232,51,230,189,208,198,47,114,191,210,112,149,82,28,111,254,120,6,88,25,140,206,30,5,137,127,29,139,32,104,57,93,203,249,2,225,74,108,239,64,250,96,146,7,227,18,216,6,182,100,149,78,39,55,191,34,47,230,72,165,139,184,63,24,28,157,182,221,243,43,231,144,31,56,188,46,229,127,226,61,217,133,37,19,50,1,158,16,245,128,229,178,26,76,29,74,1,80,128,161,251,19,169,18,245,36,175,222,149,95,93,77,53,47,35,10,2,153,130,136,52,112,208,173,1,209,12,123,197,128,60,186,43,127,119,55,211,201,147,46,125,7,241,201,99,155,141,9,118,98,128,26,4,10,130,215,8,106,6,92,192,39,250,238,53,234,188,33,189,192,18,81,244,51,0,209,57,23,231,40,6,173,61,33,129,246,35,158,167,58,21,168,137,75,168,90,217,205,154,229,185,169,144,124,178,105,138,154,225,71,70,59,247,8,216,140,23,216,14,168,2,131,224,217,21,249,78,174,10,112,117,5,81,128,150,11,160,228,136,230,223,81,185,17,198,54,80,131,102,94,76,73,234,95,141,47,100,100,117,20,0,204,18,144,68,144,76,247,150,225,78,60,138,3,16,58,104,255,254,223,186,47,237,231,247,174,184,58,125,21,100,65,18,228,2,48,137,6,170,197,255,28,169,15,62,234,240,62,89,122,99,83,19,44,209,227,243,254,183,0,104,189,27,65,55,77,26,194,182,36,238,116,250,93,152,159,69,138,55,74,186,84,150,26,128,214,171,122,146,185,106,139,47,85,75,103,51,142,140,175,117,114,160,36,189,79,69,161,119,5,15,50,192,139,4,135,23,176,212,36,228,248,115,193,227,49,198,108,180,67,234,247,30,19,58,107,254,171,222,152,254,204,236,40,1,1,125,119,245,5,171,30,215,214,191,237,38,216,63,208,46,123,187,63,189,204,226,65,112,91,235,21,21,62,220,3,129,79,176,224,193,38,110,52,28,206,148,106,66,159,82,210,224,166,4,250,219,16,138,115,127,142,251,234,157,0,230,60,162,170,25,153,71,247,35,225,167,153,99,216,15,13,195,39,76,194,10,80,125,90,170,87,94,25,179,84,64,64,191,30,91,210,207,206,18,101,155,3,31,180,58,221,212,163,232,79,247,30,116,107,171,127,10,133,81,70,232,112,69,222,91,89,168,57,58,71,177,118,200,156,239,197,55,147,209,41,119,24,42,179,239,43,86,191,248,143,190,195,117,118,204,132,123,49,15,146,74,93,77,184,32,204,12,34,37,128,137,191,199,180,15,236,217,65,151,206,73,3,101,63,134,247,216,61,140,72,217,193,23,17,162,9,110,230,128,247,28,191,248,248,27,21,178,214,209,180,75,21,179,27,154,235,171,63,160,9,153,45,109,102,6,4,224,153,137,63,7,109,168,107,229,219,79,234,2,204,154,252,134,28,108,64,40,19,103,24,214,146,128,54,14,225,134,217,136,67,112,224,72,57,223,210,120,154,186,94,250,111,227,249,119,150,35,162,163,74,6,125,6,250,70,58,120,158,66,45,41,100,236,147,64,94,158,77,45,43,155,220,241,156,156,223,191,24,43,26,65,231,240,71,5,99,73,74,117,208,182,35,136,139,144,130,134,15,32,76,52,138,142,125,53,16,175,21,60,123,230,133,108,44,127,189,50,130,140,29,112,109,84,123,222,224,68,181,101,246,63,225,125,76,36,97,201,232,210,149,13,201,36,149,215,205,205,48,94,100,11,54,225,175,228,40,42,76,96,254,203,42,123,172,162,135,218,204,109,197,214,133,33,18,122,186,142,142,18,228,101,21,197,85,65,160,222,2,120,194,94,207,114,100,96,237,76,209,76,191,203,187,229,12,118,25,78,8,252,61,198,55,180,204,74,37,67,0,71,235,73,66,230,228,89,67,53,132,252,198,213,220,173,43,27,150,105,225,178,248,176,36,226,254,183,63,52,11,136,147,153,15,112,164,224,182,2,107,157,238,116,199,30,97,104,64,169,91,228,122,150,44,110,56,189,159,145,205,149,72,40,242,55,43,27,222,227,144,152,16,169,76,192,9,46,11,218,93,111,56,134,124,60,66,139,210,170,180,173,109,31,69,127,117,39,162,231,88,26,238,12,149,151,220,90,242,254,249,207,148,34,189,210,162,108,26,12,108,103,207,22,125,157,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,113,95,49,95,108,97,103,114,97,110,103,101,0,0,0,16,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,255,255,239,84,156,194,5,125,103,34,222,192,99,245,164,138,210,107,105,78,234,75,51,142,157,23,206,68,103,31,42,0,0,0,3,113,95,50,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,25,30,64,95,235,13,171,42,228,62,124,180,116,227,178,31,242,75,250,39,219,137,233,73,73,35,134,47,44,128,193,13,16,95,107,169,29,208,35,15,148,61,97,255,209,43,101,21,149,96,197,119,184,208,113,228,116,30,51,136,214,50,41,21,111,117,214,118,104,98,247,124,0,96,41,18,65,95,219,179,255,65,91,75,226,130,203,107,91,164,76,236,179,14,239,9,212,217,146,93,102,184,79,7,90,168,67,179,167,43,177,190,157,93,83,187,54,124,24,158,72,47,130,153,101,68,40,10,7,239,61,66,191,100,68,213,61,129,232,151,28,172,32,30,118,203,35,145,171,127,81,231,71,143,247,102,59,94,184,22,90,88,151,124,55,133,103,230,173,36,191,209,204,96,52,192,183,138,10,245,80,178,220,122,201,243,53,92,126,243,160,31,232,34,162,159,159,221,237,151,85,165,246,161,139,141,232,98,43,182,194,210,58,27,39,142,63,207,123,223,130,228,5,5,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,16,232,225,191,144,168,231,54,25,173,49,61,197,211,4,129,8,107,12,135,89,219,187,102,110,224,124,171,177,70,206,162,34,241,160,148,70,118,37,190,52,253,50,88,122,118,188,206,18,200,247,187,9,254,116,222,211,180,129,254,88,156,27,59,27,146,138,41,121,43,147,234,198,144,16,144,103,7,137,88,116,93,22,38,54,212,194,132,76,206,251,228,244,190,63,117,38,45,38,109,146,45,61,146,60,55,200,117,198,160,188,130,105,191,250,45,198,127,201,55,26,225,112,175,71,13,10,60,38,250,16,194,173,212,144,157,110,83,239,208,225,43,60,19,10,231,140,93,240,10,198,254,208,225,16,58,122,55,240,171,25,167,167,104,115,92,112,122,93,227,75,250,167,123,135,255,103,165,205,118,140,101,147,115,61,96,172,251,132,244,90,195,16,25,221,93,80,244,23,244,171,59,203,194,215,188,90,75,197,49,162,190,174,123,42,41,42,234,208,181,1,240,105,94,43,0,0,0,7,113,95,50,95,102,102,116,0,0,0,68,92,65,127,181,198,89,181,35,146,85,92,92,53,240,231,147,60,119,25,190,180,125,35,91,48,246,224,163,214,202,162,27,145,123,194,11,154,75,4,55,101,141,212,229,235,31,99,254,141,106,93,178,27,19,147,195,239,206,181,44,222,117,225,93,35,85,255,121,208,180,244,170,171,48,218,21,86,184,110,224,32,6,150,209,32,18,211,210,120,134,44,224,67,34,3,44,32,72,65,9,100,147,157,236,222,125,150,200,185,20,145,243,175,110,131,244,23,106,90,184,213,185,197,92,70,248,9,53,178,202,57,54,172,14,138,189,169,125,191,11,80,145,49,225,251,116,238,187,210,202,150,101,104,68,40,121,112,206,13,45,166,94,137,5,44,178,46,14,61,142,147,80,14,128,213,114,237,244,126,154,77,154,143,175,115,183,7,78,26,89,251,74,164,232,229,35,232,195,27,160,222,11,84,26,176,130,36,147,121,10,111,178,32,40,201,175,192,243,12,51,64,42,118,57,175,80,118,46,64,122,251,212,219,126,141,2,158,189,67,120,154,209,54,44,13,168,43,16,225,71,252,144,11,222,169,41,127,214,158,135,92,166,221,131,172,228,234,146,92,215,70,65,129,231,61,96,32,162,31,226,42,136,59,176,227,215,223,7,144,245,233,170,191,98,210,46,173,197,43,245,43,191,201,68,213,193,196,109,85,224,253,237,251,1,37,26,123,33,79,22,241,170,128,183,54,228,37,56,152,109,205,113,209,113,83,182,56,15,142,34,170,179,108,32,85,55,135,217,26,52,123,36,34,108,70,219,222,170,97,66,10,161,119,156,119,192,21,204,104,241,22,159,218,255,80,201,230,131,147,208,146,195,137,68,157,167,77,201,199,231,250,34,33,189,96,53,33,14,70,0,46,36,97,149,178,211,238,148,86,178,219,2,254,6,11,32,117,240,127,47,182,61,72,14,50,96,70,155,153,44,218,11,31,71,107,9,174,3,174,177,108,50,116,35,33,147,84,89,38,215,106,107,7,204,24,115,212,116,61,240,171,42,28,43,62,171,94,199,45,68,147,225,29,245,51,197,4,112,1,22,252,163,161,37,253,202,199,236,172,192,202,246,14,123,193,3,77,145,5,53,156,71,44,168,6,124,230,181,94,24,208,36,35,64,186,237,177,101,122,119,108,15,158,8,105,183,3,113,126,187,222,146,159,123,15,122,196,125,62,137,141,245,90,21,210,1,22,186,35,58,178,1,85,8,238,106,163,194,179,201,27,213,19,9,126,10,156,140,139,44,206,59,132,181,226,33,38,36,166,251,58,129,46,186,189,153,122,218,173,233,122,28,95,152,130,13,161,18,9,174,79,144,77,148,134,246,88,19,166,131,73,113,20,111,158,109,173,0,46,112,251,168,151,67,252,150,253,162,42,190,38,121,76,135,161,80,107,194,4,3,237,130,251,48,137,176,229,17,235,86,132,174,81,155,13,176,96,133,166,163,104,150,135,112,251,243,203,143,248,237,166,32,145,71,252,57,12,166,105,141,254,109,22,66,100,172,184,132,147,156,148,250,43,66,176,133,227,184,184,199,125,46,117,16,225,249,172,200,251,236,86,175,57,125,205,182,94,143,12,114,100,50,198,56,129,228,238,127,50,156,25,89,178,129,154,74,39,103,232,180,74,211,114,65,188,12,125,197,69,187,28,179,254,240,157,223,161,68,31,136,55,8,53,154,153,235,156,45,7,6,146,246,0,195,40,93,158,14,73,145,125,95,32,119,112,8,62,96,216,141,26,49,119,173,80,82,211,147,21,45,1,53,97,201,200,81,44,96,130,114,113,59,232,216,22,51,164,255,238,211,39,233,99,139,194,25,61,53,224,107,140,60,20,33,108,58,240,120,199,152,101,70,106,149,209,17,42,112,218,232,99,22,14,18,23,68,96,165,2,113,167,88,233,56,78,33,148,85,69,225,254,14,33,24,141,20,234,130,20,174,34,250,204,134,213,47,189,145,37,49,185,96,159,217,46,11,83,217,253,12,39,179,158,122,35,58,183,25,180,225,6,109,81,172,235,100,228,133,98,181,252,243,26,119,252,122,231,42,152,73,82,10,0,188,11,150,98,91,136,221,43,49,189,111,14,25,16,206,226,228,73,220,68,69,250,224,177,155,85,57,31,243,147,197,26,116,216,62,121,179,53,56,5,216,234,211,118,112,121,198,77,82,206,39,31,32,120,19,41,174,216,91,196,142,47,163,4,227,174,163,182,56,171,179,115,185,253,47,84,152,249,206,2,46,145,74,78,193,190,115,233,94,138,39,188,115,75,178,145,78,228,200,121,197,72,198,172,121,28,59,241,53,159,123,93,31,150,71,168,203,185,160,95,72,227,2,177,223,188,67,179,247,250,216,67,177,64,142,29,191,31,72,75,189,184,146,189,182,239,252,148,205,181,221,92,30,111,2,185,134,79,36,138,12,255,64,173,235,217,127,75,42,17,138,163,200,199,227,201,64,79,123,70,121,167,162,19,70,194,89,34,66,226,117,83,171,0,150,111,201,236,27,92,34,148,62,5,66,231,57,126,90,78,136,124,230,205,98,8,20,251,80,48,133,135,41,153,32,231,28,37,87,156,208,233,181,3,129,8,138,41,179,248,223,248,249,135,41,192,28,11,43,254,65,172,107,204,107,138,11,180,18,219,240,139,231,163,22,130,51,79,86,172,37,196,219,195,112,23,185,117,180,5,253,80,1,154,216,235,109,208,174,196,48,29,96,16,44,225,64,7,134,183,228,69,129,227,21,136,132,214,217,172,167,59,47,155,17,27,136,212,83,157,249,185,39,211,204,64,225,139,164,146,200,124,216,138,210,198,56,103,182,165,215,202,159,227,198,180,63,109,8,52,83,60,252,218,230,212,106,152,22,235,185,22,71,80,107,182,160,150,84,53,220,108,144,212,176,200,239,155,25,150,186,63,159,3,207,249,24,26,41,40,201,207,251,132,132,95,33,24,231,159,33,205,69,110,164,110,212,231,200,139,56,145,97,109,43,8,69,165,199,214,63,35,43,228,224,46,169,193,220,115,37,246,78,13,82,25,71,246,79,215,215,23,41,54,143,221,47,142,96,58,250,226,244,153,106,255,69,37,251,7,202,148,29,22,38,111,201,88,158,184,170,212,56,117,26,197,128,190,160,93,120,51,58,203,234,63,190,181,45,20,226,66,212,150,8,49,53,146,175,233,220,106,27,83,35,249,80,231,223,205,216,92,51,234,101,40,54,167,79,66,219,187,210,206,82,135,34,225,49,39,133,11,168,199,139,115,92,78,61,176,184,244,237,156,204,3,75,133,221,18,165,12,100,162,163,12,44,29,34,198,200,211,159,59,47,233,148,106,154,242,53,218,224,70,84,74,142,147,210,231,214,234,98,79,87,194,200,73,217,99,129,239,74,121,132,4,215,69,64,197,108,216,73,239,235,16,100,134,83,216,37,234,151,114,244,45,139,15,118,12,114,139,145,241,192,107,51,198,150,72,211,250,61,59,95,198,231,212,67,193,24,84,239,11,165,74,63,172,12,24,213,207,1,30,251,133,81,73,185,23,187,33,81,114,2,105,53,190,59,219,154,126,243,190,167,134,138,41,39,111,129,53,137,116,110,176,28,117,151,99,5,149,241,93,36,85,210,184,40,108,166,182,104,29,21,70,178,212,236,56,217,87,214,76,64,15,36,34,114,157,227,86,56,188,114,150,104,173,47,54,36,221,128,172,34,103,134,150,32,225,231,73,202,61,232,84,153,221,220,19,247,38,250,121,160,27,105,121,173,11,181,104,65,211,54,123,6,195,120,150,159,63,198,31,81,232,79,101,44,242,181,120,203,168,192,158,29,11,90,172,157,107,17,226,40,197,22,86,85,139,241,173,79,135,49,35,113,19,165,186,37,85,194,71,98,145,173,32,157,178,39,151,186,251,99,192,55,115,0,121,189,13,21,169,97,182,99,124,141,247,20,23,15,124,146,234,170,115,15,31,132,187,168,110,105,47,108,62,76,5,194,36,85,251,125,149,121,53,55,131,245,128,122,124,85,9,226,17,222,128,135,39,81,187,36,56,86,168,21,59,85,185,206,113,236,191,16,35,248,184,26,6,135,163,1,250,105,106,90,223,215,127,194,201,173,242,138,12,123,19,157,79,76,52,89,181,158,152,132,232,214,149,24,225,187,61,134,39,43,240,164,102,91,97,40,1,115,42,105,15,188,179,184,63,27,220,159,224,28,16,121,247,179,150,61,107,190,137,140,245,152,204,186,193,161,134,2,62,162,110,253,51,183,236,68,106,63,129,34,109,181,167,23,106,95,226,116,94,52,14,161,196,154,107,67,232,91,3,103,0,230,52,113,124,113,23,64,161,29,162,164,43,142,96,141,9,158,71,150,115,167,203,97,192,255,103,133,217,62,116,59,191,7,124,78,216,24,217,117,106,61,163,232,87,224,156,6,21,13,208,53,233,24,110,218,150,146,37,151,242,240,221,56,42,44,104,220,26,89,110,144,141,73,50,59,127,183,73,0,91,242,132,246,59,142,37,231,92,45,145,5,150,209,35,238,247,78,248,240,206,156,144,220,20,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,113,95,50,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,255,255,79,221,218,118,110,21,196,201,3,14,242,189,179,91,192,99,96,7,72,106,225,147,220,237,134,147,144,197,7,0,0,0,3,113,95,51,0,0,0,16,255,255,255,15,108,10,30,188,110,143,70,134,183,23,204,215,162,167,126,126,73,186,175,71,214,95,206,30,141,177,155,31,47,105,2,24,44,61,202,225,13,32,123,108,193,107,94,173,50,114,254,198,176,90,125,164,150,196,246,249,175,17,22,17,212,54,198,19,37,196,236,18,249,140,57,127,198,118,190,90,186,184,182,149,230,68,142,29,18,230,63,42,140,127,115,26,78,45,231,99,47,178,137,217,194,249,98,34,71,84,65,171,26,157,214,254,238,114,188,4,251,25,142,7,130,73,178,23,206,168,128,2,146,158,95,184,42,133,27,158,249,61,105,233,94,184,141,220,221,237,220,88,12,98,175,180,15,99,95,44,93,116,146,10,202,247,15,36,96,11,13,172,211,201,170,103,94,130,48,250,24,93,230,138,166,181,221,0,246,156,82,51,112,46,189,99,187,107,16,190,144,53,82,201,219,132,39,28,55,129,140,241,9,188,107,253,166,160,170,130,36,9,87,15,98,165,197,232,147,116,194,27,177,68,144,136,185,158,85,207,109,211,99,97,22,122,34,230,200,37,248,167,98,90,176,35,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,32,29,59,252,68,189,13,82,103,98,31,174,164,55,182,8,16,132,240,26,4,129,169,43,228,115,82,6,117,152,41,233,4,45,201,57,220,110,49,245,48,152,227,127,250,129,113,117,205,162,159,202,235,207,0,194,154,23,186,241,182,230,206,240,21,255,118,23,233,77,142,116,179,62,182,127,104,250,181,89,58,249,29,196,77,249,214,60,60,57,157,160,72,57,64,177,46,53,87,127,205,41,66,70,19,137,204,16,207,223,122,50,143,184,80,246,167,69,227,19,208,112,126,229,238,72,136,205,36,89,231,110,120,116,168,151,26,82,150,60,54,196,228,85,43,165,203,184,61,34,42,17,93,162,115,136,82,167,196,118,23,145,209,66,140,216,137,209,133,0,59,103,176,108,99,12,12,38,215,244,143,172,137,228,186,130,255,134,94,78,69,13,33,84,182,59,154,170,43,229,34,1,93,185,89,222,15,171,195,149,122,133,214,36,13,213,1,128,3,110,171,58,7,25,39,0,0,0,7,113,95,51,95,102,102,116,0,0,0,68,96,235,41,49,136,78,16,56,49,164,6,15,31,30,12,18,215,50,132,7,160,167,165,108,130,110,90,163,189,88,175,57,210,214,50,20,15,197,65,137,142,188,120,64,210,22,214,36,208,41,66,170,232,165,94,141,194,42,100,67,44,247,217,71,29,106,78,42,31,106,26,190,167,163,150,239,86,136,163,158,188,178,190,138,81,230,40,137,10,6,129,47,114,202,151,75,77,7,134,206,202,14,41,115,184,238,243,40,6,95,129,76,66,188,13,149,114,94,31,30,208,113,85,34,47,178,126,72,111,92,150,127,203,108,215,120,30,128,204,2,108,158,145,169,250,194,13,236,127,159,233,87,124,168,138,238,238,244,194,88,236,108,97,224,76,65,183,66,187,154,197,172,63,90,82,139,60,64,114,141,212,19,152,64,144,67,102,78,97,180,237,11,232,123,176,62,89,196,181,73,109,0,203,185,146,162,229,197,65,220,69,55,200,165,66,10,191,137,88,184,86,222,244,58,118,59,175,201,5,93,87,165,88,100,207,100,181,162,88,167,17,66,74,201,21,250,146,247,53,60,77,224,197,218,12,31,86,111,175,251,222,176,24,240,182,53,117,215,230,232,214,34,161,11,97,239,44,251,206,137,211,218,210,7,34,166,74,7,74,242,159,36,190,33,157,121,133,72,154,149,236,14,215,213,35,123,14,237,104,50,209,230,33,164,118,43,78,236,92,71,26,224,65,192,104,212,12,157,129,191,147,195,69,42,59,184,252,180,159,11,92,68,249,67,192,107,9,71,99,31,21,72,42,96,117,167,199,37,213,2,63,28,41,158,251,126,136,242,113,164,241,137,196,85,35,65,96,149,17,241,76,91,184,83,231,241,11,207,233,122,97,51,155,210,17,107,118,132,239,197,109,35,66,80,180,152,22,106,211,53,64,192,147,37,21,21,86,214,112,48,90,112,103,79,128,39,205,234,5,173,249,91,165,84,179,87,11,249,9,212,227,234,245,77,116,4,217,5,106,147,180,156,104,131,12,39,206,189,206,199,130,51,129,29,79,129,144,214,67,196,121,202,52,74,105,218,27,170,7,33,55,128,244,42,96,202,211,93,36,152,23,9,194,170,37,15,21,66,77,129,141,79,238,11,211,216,227,67,24,53,236,10,114,207,221,162,176,61,204,102,157,247,189,255,191,181,39,55,91,102,70,150,215,227,68,86,126,17,156,46,245,211,114,35,48,211,1,125,46,104,242,210,195,219,206,65,59,48,89,30,4,149,139,33,180,182,154,217,9,228,85,163,113,209,69,61,168,131,187,200,188,39,38,15,196,21,144,137,171,108,143,77,232,141,82,212,214,77,150,9,11,56,226,242,197,124,3,0,219,137,138,94,169,68,176,230,89,120,60,138,109,7,247,35,20,218,174,172,233,132,147,180,138,91,65,113,164,26,38,1,5,69,113,63,188,225,233,174,24,225,85,11,141,57,132,123,245,181,194,245,242,161,222,41,73,94,22,50,35,92,251,39,174,22,80,115,238,255,173,118,176,127,67,249,183,106,43,66,247,63,143,42,58,182,255,136,236,199,175,65,173,97,176,35,48,38,131,239,164,142,213,142,203,246,221,42,52,79,126,52,239,220,154,250,138,68,202,17,1,254,80,84,51,178,133,76,226,200,169,51,161,54,175,87,235,33,150,59,163,141,245,249,38,77,77,88,92,255,234,5,18,80,51,247,56,160,80,38,100,200,24,48,57,113,21,146,233,59,196,128,240,69,137,164,179,37,83,70,206,158,58,31,145,4,255,75,46,215,106,34,173,114,251,185,29,213,95,53,105,8,89,82,92,117,46,155,214,183,112,188,251,72,190,159,248,44,22,167,28,167,6,30,105,246,80,143,208,175,49,36,179,49,27,135,241,201,50,197,190,173,45,8,138,162,160,246,184,68,211,230,121,216,153,37,197,210,226,86,221,165,125,168,206,77,176,28,61,50,27,224,94,86,245,19,38,213,25,0,168,235,135,22,146,42,231,23,252,68,0,155,116,59,61,163,167,48,16,51,168,64,82,144,115,129,210,145,119,41,182,56,114,137,47,189,40,244,87,42,175,242,103,75,230,139,62,47,237,38,22,177,23,40,20,159,186,62,107,248,11,254,85,112,41,108,86,33,219,73,117,68,29,126,202,240,251,14,52,23,13,26,239,43,63,192,69,103,3,209,103,32,53,243,209,2,173,51,176,172,53,30,53,95,134,184,28,1,87,184,237,24,161,116,36,171,210,220,14,255,158,154,135,108,14,65,146,138,204,112,234,197,51,3,146,10,224,122,17,32,151,189,59,40,183,167,219,209,81,155,254,187,116,168,26,240,113,43,139,98,38,31,195,215,148,97,82,32,196,143,33,7,121,97,46,220,138,42,116,135,234,128,58,2,48,1,222,245,41,229,158,48,82,58,197,138,36,226,86,6,165,163,241,111,238,228,137,149,120,70,202,183,173,28,2,139,150,219,185,201,76,203,165,178,8,208,154,67,3,178,28,4,255,233,145,75,60,129,175,36,125,182,20,124,107,182,8,81,184,4,54,72,207,54,196,127,1,175,251,210,200,10,186,93,25,203,101,204,249,86,201,21,11,32,107,137,18,196,90,23,43,47,35,40,246,38,0,237,90,127,243,139,156,84,92,32,250,244,83,168,96,180,158,228,64,116,166,81,94,78,95,220,83,43,206,254,254,124,35,35,67,94,8,57,83,98,144,40,146,19,2,225,249,136,76,3,227,180,70,77,52,116,139,72,122,147,187,41,156,131,177,65,152,121,137,87,39,181,218,36,252,78,208,29,167,90,177,251,153,66,138,78,3,75,171,103,230,157,154,73,237,19,101,43,187,93,233,42,183,193,116,37,96,80,78,54,52,126,192,151,101,197,247,182,17,68,189,29,63,169,238,163,126,87,81,43,193,119,111,209,173,251,60,13,26,88,24,71,146,49,136,249,225,132,241,211,197,53,8,224,88,234,34,52,30,149,153,98,91,20,154,238,80,176,199,66,162,75,182,72,12,134,107,80,148,79,202,121,33,183,189,95,254,92,119,189,192,249,161,77,206,221,0,90,228,145,149,53,56,107,197,158,17,207,214,30,163,137,107,78,64,97,147,3,101,200,249,107,199,245,50,5,117,124,3,68,154,56,225,54,237,143,68,241,113,42,119,233,198,226,201,14,39,206,211,235,168,204,63,94,186,102,147,80,83,14,165,151,130,63,54,40,92,230,236,239,242,79,227,83,58,59,192,139,244,181,102,27,31,20,3,244,140,162,43,72,153,149,112,60,11,251,59,88,100,107,234,47,204,209,62,99,253,64,168,147,107,162,29,27,24,161,71,63,177,154,103,145,149,77,219,160,26,72,106,27,169,212,82,253,196,46,188,224,157,41,168,26,10,74,224,128,18,34,37,148,114,38,127,6,159,139,161,198,54,66,185,80,132,43,222,186,148,61,178,44,61,42,219,193,221,205,115,16,124,248,242,194,80,72,149,185,32,211,108,183,164,74,40,41,82,5,89,48,161,140,183,13,4,14,167,134,253,135,44,139,1,221,55,46,239,45,70,231,5,175,145,254,194,27,215,29,38,175,195,103,175,50,186,31,101,191,47,88,132,179,122,54,56,55,51,213,42,220,117,97,10,65,234,133,58,21,89,84,53,47,33,173,54,34,192,53,156,188,232,216,80,40,194,95,210,51,247,144,214,36,90,246,106,53,29,252,143,1,150,46,101,67,107,189,158,171,196,141,141,195,112,132,92,180,96,166,56,56,249,84,184,131,217,120,126,244,155,25,83,129,232,64,80,108,79,0,124,159,159,37,149,26,155,173,83,25,76,47,64,185,77,235,30,179,238,210,33,213,42,83,239,206,177,65,140,12,109,95,112,69,218,55,251,17,35,246,171,20,53,120,183,217,149,103,235,205,23,157,55,185,197,130,137,208,101,88,20,244,241,95,165,146,89,217,251,114,185,194,173,41,195,118,141,34,80,169,184,94,35,116,166,255,150,91,212,219,204,50,184,218,1,111,174,216,6,117,247,17,209,174,91,49,242,160,4,92,172,22,187,142,45,154,177,245,54,228,254,71,94,10,45,128,80,168,109,154,195,134,91,249,50,175,240,189,199,234,30,121,234,204,134,1,119,71,229,40,137,193,94,112,114,35,137,126,103,5,163,195,81,111,120,18,30,33,185,81,59,225,244,41,226,242,195,248,71,92,186,72,230,172,228,233,181,23,227,239,124,120,212,54,46,255,135,15,232,145,22,133,169,161,39,34,17,232,16,35,158,51,130,165,189,113,201,236,0,65,40,197,198,187,152,95,127,59,116,246,115,46,8,135,140,12,78,104,132,10,142,155,6,195,96,54,101,105,141,155,239,40,89,239,49,193,145,189,216,197,57,230,229,130,233,156,135,33,227,155,64,109,225,165,136,96,3,76,229,182,81,71,246,9,151,223,131,11,61,107,122,160,216,176,144,32,16,26,217,166,108,53,91,53,207,3,245,231,44,18,118,4,192,70,167,28,194,114,34,192,86,109,252,177,177,74,217,26,195,153,3,198,170,137,154,77,243,160,247,207,175,170,148,229,6,216,199,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,113,95,51,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,255,255,159,249,14,13,27,63,145,42,163,163,104,186,234,137,6,221,216,118,235,216,71,195,187,245,32,85,8,208,21,0,0,0,3,113,95,52,0,0,0,16,255,255,255,15,108,10,30,188,110,143,70,134,183,23,204,215,162,167,126,126,73,186,175,71,214,95,206,30,141,177,155,47,161,213,145,45,92,48,72,179,58,249,54,150,41,180,3,66,188,21,78,218,34,30,204,61,218,34,222,82,176,5,98,2,152,14,33,126,44,184,181,22,94,220,17,255,186,193,23,160,223,16,168,179,20,185,170,86,175,173,76,204,65,204,189,31,86,98,104,119,237,253,24,80,61,220,221,45,57,88,46,148,125,250,151,211,182,147,170,251,157,124,145,86,251,174,149,16,212,217,146,93,102,184,79,7,90,168,67,179,167,43,177,190,157,93,83,187,54,124,24,158,72,47,130,153,101,68,40,10,228,12,247,8,173,124,146,164,217,56,113,197,19,119,162,80,33,16,147,209,75,38,55,142,176,170,149,99,109,240,9,44,135,4,227,58,211,71,155,217,4,183,158,58,51,145,78,160,19,208,143,111,121,11,75,56,174,237,80,138,61,109,113,47,187,251,208,29,146,158,230,158,159,71,118,58,148,67,192,249,224,29,140,49,42,233,77,16,135,43,233,153,217,236,6,8,3,0,0,208,187,224,165,203,179,81,44,109,217,184,155,120,23,9,132,132,35,209,240,40,125,224,148,163,88,235,44,49,96,42,110,194,55,197,153,144,86,119,130,227,30,52,48,230,160,66,51,167,147,39,132,122,79,125,83,142,194,72,2,46,105,241,222,113,103,61,44,45,51,148,167,122,141,38,28,136,125,71,217,205,161,140,165,97,122,242,228,20,49,130,166,16,171,157,151,120,166,247,200,243,83,148,219,75,15,144,5,148,223,93,233,173,255,177,165,188,139,35,160,138,119,159,206,31,45,38,109,146,45,61,146,60,55,200,117,198,160,188,130,105,191,250,45,198,127,201,55,26,225,112,175,71,13,10,60,38,29,243,8,231,230,120,79,159,183,55,72,180,52,113,145,215,59,72,238,175,106,31,25,42,121,245,155,125,5,94,90,4,123,251,28,165,84,163,40,174,29,42,212,184,93,63,25,176,166,224,114,147,243,127,85,56,165,82,18,56,168,47,87,49,70,4,47,210,1,87,251,164,241,40,67,63,180,164,115,46,124,58,245,79,140,92,2,168,162,116,72,71,153,97,93,40,0,0,0,7,113,95,52,95,102,102,116,0,0,0,68,198,179,43,33,83,197,251,207,15,77,146,188,13,76,232,96,219,35,7,81,33,67,55,95,158,5,176,72,105,23,227,47,182,113,139,138,225,69,248,201,102,143,58,18,211,140,168,161,147,201,205,246,29,4,182,60,150,57,168,138,31,195,241,36,117,63,215,6,143,250,157,229,216,187,181,228,169,142,235,226,184,151,47,251,232,132,65,227,202,153,187,161,161,179,220,73,245,150,202,56,74,127,47,176,214,106,16,22,94,229,87,163,254,232,30,78,51,110,140,161,146,205,241,96,213,49,45,91,123,35,120,164,91,89,123,46,54,138,2,149,215,6,115,45,223,6,180,204,162,16,248,42,163,38,63,209,0,95,86,91,50,116,113,61,219,8,108,93,185,93,61,67,99,169,157,2,224,28,173,4,88,59,205,8,241,59,217,227,96,218,47,37,152,116,94,65,117,64,164,236,28,209,130,160,61,167,216,55,77,97,209,28,123,214,101,243,242,131,69,156,125,212,96,74,154,213,178,183,32,158,162,188,16,107,182,143,144,230,83,227,100,248,18,55,208,198,153,25,92,95,135,9,122,48,106,83,78,199,221,43,249,7,57,80,165,113,150,116,225,86,141,123,158,220,158,149,138,171,5,133,128,112,71,36,225,105,11,95,108,83,182,197,162,0,145,113,203,168,101,228,230,85,107,42,138,125,239,117,88,88,89,43,225,167,95,30,170,192,195,14,106,224,112,70,120,96,247,91,247,43,173,31,194,36,23,254,199,58,185,43,41,228,41,69,148,96,126,205,113,245,75,67,226,69,20,1,115,70,15,142,32,48,160,218,137,78,247,42,66,58,29,174,137,216,140,201,174,154,192,2,186,0,106,7,136,167,183,0,218,208,136,223,254,123,140,162,121,137,115,205,175,105,75,91,195,117,184,106,141,197,146,204,208,47,57,85,0,215,71,80,146,21,57,128,99,16,215,203,202,56,209,101,160,89,156,159,239,89,216,231,206,0,90,238,169,126,209,57,151,233,250,74,66,25,158,92,31,8,61,179,49,53,42,36,247,204,27,253,146,235,155,219,96,104,163,67,215,13,61,64,162,154,70,127,111,13,205,236,66,80,52,199,182,197,46,192,167,130,189,197,198,181,253,6,209,88,156,167,22,5,170,32,106,171,200,211,102,38,109,119,19,209,68,116,123,245,21,193,59,228,137,42,223,27,152,108,128,206,111,129,4,62,181,32,233,46,103,253,8,142,92,217,27,255,9,54,113,143,229,65,100,168,84,191,47,68,216,221,206,214,192,157,165,93,129,33,153,161,21,215,17,22,84,145,121,183,156,79,157,198,126,97,161,74,47,232,153,170,228,153,100,44,30,46,122,22,9,1,158,146,53,116,174,141,229,175,12,17,70,72,43,2,10,88,190,239,82,97,8,127,159,57,89,126,180,104,52,143,0,79,187,95,253,137,86,229,36,225,223,197,67,9,53,20,186,142,225,79,59,53,53,1,87,58,149,214,167,224,177,172,171,89,243,41,222,238,67,95,175,80,6,78,78,135,44,15,181,170,84,40,128,212,102,21,51,191,194,41,7,40,71,18,129,39,88,92,147,146,233,141,250,204,212,180,92,165,13,14,41,99,59,182,75,56,44,122,39,167,207,186,65,226,94,243,171,26,214,21,107,79,103,100,154,118,130,195,93,18,172,29,26,32,203,182,204,44,241,6,179,165,210,226,121,120,5,1,115,45,214,32,24,247,165,100,166,187,45,165,70,105,122,43,22,231,127,162,128,110,169,137,115,160,37,41,104,253,222,75,148,63,169,119,14,212,66,50,31,232,63,243,204,76,91,210,120,251,220,197,14,139,97,94,165,169,178,130,169,225,100,86,86,96,224,105,29,167,50,201,20,29,147,221,157,118,159,211,11,125,82,145,43,24,100,190,243,176,93,249,175,203,213,1,129,31,89,60,158,55,247,28,154,123,189,46,30,27,11,80,208,101,29,235,238,84,198,142,42,7,148,36,154,90,219,123,6,23,201,38,26,47,211,38,244,119,169,250,106,212,8,177,97,42,205,255,91,22,150,71,23,113,31,141,240,125,244,108,55,61,237,85,143,222,162,246,159,123,223,23,129,160,211,125,227,136,203,32,3,75,22,218,90,206,73,25,35,28,24,145,19,93,232,96,90,5,206,123,247,34,71,213,120,117,165,236,30,128,171,17,58,59,86,33,144,21,119,239,217,137,21,115,13,42,1,209,142,6,149,159,115,126,37,112,76,60,244,46,164,32,237,247,236,13,190,178,92,103,87,210,236,44,75,140,34,43,164,167,46,68,150,70,48,180,124,222,157,154,98,127,135,153,14,9,248,187,15,194,15,173,15,56,180,90,114,40,97,92,80,130,12,56,63,243,190,48,158,125,213,121,23,139,233,39,63,91,54,254,238,150,11,151,56,7,17,166,94,149,234,91,165,220,218,33,126,188,27,180,50,82,45,56,176,196,70,117,228,214,32,162,174,120,141,13,233,235,177,182,150,187,41,14,193,3,0,203,168,225,129,240,113,177,7,12,249,44,233,227,25,234,124,118,72,45,103,54,108,81,166,194,91,130,201,92,91,187,63,30,216,123,95,44,172,147,128,190,36,253,57,141,247,122,70,71,39,232,132,7,195,10,67,100,178,5,28,75,190,108,104,225,139,204,237,77,198,7,179,209,211,61,23,167,87,98,75,148,240,202,238,160,72,20,53,58,79,250,253,75,134,23,247,196,77,243,34,118,24,243,250,48,145,59,246,19,118,76,221,174,198,239,218,120,152,100,253,133,62,44,176,16,16,39,52,51,180,174,140,65,161,150,153,250,161,209,207,242,235,52,217,78,39,24,205,134,14,134,84,75,158,236,4,54,102,225,203,210,5,224,77,33,146,219,227,171,207,139,21,217,237,195,48,41,167,176,105,152,29,58,22,223,215,50,75,21,46,132,60,144,222,35,35,19,32,80,140,65,255,93,250,174,131,68,37,104,19,82,136,31,243,101,28,54,13,72,175,55,232,49,96,79,156,230,241,248,155,241,237,40,225,203,67,203,38,123,64,217,140,57,160,172,143,208,243,79,212,41,12,17,104,188,153,35,124,244,135,44,135,75,175,217,145,198,141,41,60,35,50,129,236,47,236,63,87,105,6,226,204,30,87,46,234,7,45,75,28,108,8,15,224,164,36,162,13,144,127,33,3,168,126,39,253,120,225,110,55,35,198,22,61,182,122,17,134,117,70,69,208,31,157,205,66,18,112,50,237,237,101,114,155,220,220,172,158,14,135,213,116,83,85,193,252,18,138,84,255,177,209,66,111,24,92,159,250,125,85,112,86,116,33,191,144,86,53,172,202,36,150,155,158,190,212,200,77,200,144,67,126,32,18,135,68,52,50,128,121,127,78,103,21,58,92,141,243,227,59,29,229,73,13,197,86,76,96,158,113,218,167,14,116,98,146,160,22,158,46,74,53,91,96,189,42,98,212,100,34,128,251,189,108,135,224,134,187,10,66,162,249,70,122,91,157,26,210,90,231,76,3,175,107,195,129,45,154,8,230,227,172,170,215,210,102,236,172,5,132,58,141,245,254,97,111,33,143,64,232,165,49,25,32,193,149,67,161,226,6,42,228,31,205,168,99,231,43,97,122,223,218,220,117,61,106,134,56,73,210,247,223,247,163,38,121,228,171,101,154,228,24,205,61,250,149,35,91,64,171,243,51,184,138,103,189,115,145,154,143,59,247,140,148,166,93,123,198,125,254,246,234,180,71,202,182,6,204,198,50,32,59,208,80,2,139,193,229,79,78,54,76,57,25,69,174,86,92,125,184,176,195,151,253,143,186,88,93,183,45,186,204,206,188,137,82,231,53,58,148,235,137,111,161,93,224,38,12,102,103,92,63,211,101,146,0,139,129,45,39,86,26,207,101,43,190,62,150,49,221,94,16,211,194,194,138,50,10,189,157,35,254,171,106,121,50,20,64,171,18,239,173,167,224,11,199,167,123,121,148,242,102,156,73,214,115,139,238,19,138,101,231,112,158,26,97,72,64,87,59,28,39,3,28,51,20,0,83,166,161,105,158,193,57,23,100,108,197,105,112,4,79,93,98,163,102,187,89,181,89,115,90,223,226,16,144,155,119,46,112,213,149,74,80,41,146,136,99,149,43,96,30,61,26,205,0,240,188,198,201,155,193,217,203,230,193,28,210,125,247,190,249,41,82,109,115,239,198,111,239,245,26,215,83,14,173,238,8,120,232,137,102,76,43,221,196,68,212,58,159,214,251,64,182,125,7,82,119,172,26,18,80,86,85,37,134,48,213,197,88,17,181,171,198,245,108,33,175,241,39,59,239,36,53,93,57,34,231,194,37,35,185,60,19,118,176,160,39,29,103,35,71,255,199,120,236,181,79,4,149,62,214,225,226,80,154,244,105,84,90,180,34,171,16,241,159,228,242,1,216,49,140,172,68,187,176,50,52,30,245,208,233,224,88,209,1,38,226,248,249,28,129,21,59,60,38,123,136,25,128,119,90,30,207,81,243,80,41,113,145,48,17,195,128,78,48,6,41,6,164,187,69,52,86,155,3,136,169,225,161,64,190,100,161,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,113,95,52,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,255,255,239,21,67,163,199,104,94,139,66,57,223,182,33,184,76,86,81,230,142,71,174,242,154,253,186,22,128,218,35,0,0,0,3,113,95,109,0,0,0,16,255,255,255,15,108,10,30,188,110,143,70,134,183,23,204,215,162,167,126,126,73,186,175,71,214,95,206,30,141,177,155,31,171,122,171,39,137,98,22,245,110,230,148,101,145,202,169,222,116,161,116,24,73,104,187,20,203,121,75,71,184,15,202,19,196,215,90,106,7,244,200,3,101,79,216,127,244,74,89,69,37,88,241,29,46,116,28,57,157,199,12,162,181,76,74,5,197,38,34,182,73,236,14,137,58,110,9,126,222,74,160,1,156,39,57,216,86,29,84,40,106,205,71,86,181,98,69,4,235,108,201,30,199,209,137,71,190,68,91,83,28,126,140,7,44,7,43,223,209,131,92,7,206,183,242,173,165,112,120,21,203,166,195,75,235,217,228,177,74,18,143,32,156,78,120,248,230,27,108,85,90,18,59,138,108,42,165,60,174,164,185,29,23,214,37,215,23,220,138,27,116,129,76,113,87,12,39,132,220,78,3,126,111,79,223,58,7,77,166,7,25,100,26,32,34,72,239,2,205,165,79,231,206,214,127,105,66,243,205,48,66,253,5,206,169,85,95,31,138,42,240,197,164,19,161,34,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,32,162,41,83,37,244,221,231,151,146,201,77,37,176,63,241,6,159,25,38,52,159,225,61,44,105,61,227,8,3,122,153,50,61,40,165,133,140,1,25,64,44,33,225,249,83,157,218,226,55,0,144,99,136,209,51,127,140,216,36,63,189,1,26,43,135,125,220,166,159,94,13,192,53,209,31,147,26,215,198,187,26,59,224,242,218,230,84,96,160,73,181,24,147,216,185,17,23,147,54,193,96,25,58,64,100,156,23,160,116,82,219,72,142,169,215,35,155,7,68,105,133,136,112,20,64,44,80,11,235,180,61,55,83,198,194,140,103,143,186,193,251,95,136,154,28,50,125,226,224,116,188,93,220,254,192,22,239,188,15,45,234,41,218,24,124,25,87,40,29,239,108,8,241,219,12,164,128,9,126,3,71,246,112,125,34,83,139,217,89,234,73,16,148,19,18,128,113,250,87,87,227,202,201,120,85,187,50,98,193,80,227,105,145,49,152,200,190,254,117,141,248,77,40,40,0,0,0,7,113,95,109,95,102,102,116,0,0,0,68,94,214,202,65,150,190,86,65,72,163,37,61,92,110,171,24,182,226,190,94,164,100,10,21,229,152,195,63,112,255,243,92,105,117,149,195,154,41,36,68,158,199,100,51,168,131,47,103,109,108,210,48,225,32,189,106,220,54,140,118,108,252,14,23,216,153,239,166,150,3,5,124,157,54,52,94,31,77,17,87,57,23,20,208,127,120,44,179,7,33,91,205,131,8,37,46,197,19,106,152,169,172,25,136,192,17,241,32,43,213,220,105,86,78,152,83,253,86,97,177,14,220,92,51,44,194,166,20,117,72,213,68,204,10,179,107,11,116,182,225,149,139,161,83,128,187,221,192,128,177,219,11,19,166,88,72,88,22,165,49,236,43,49,108,221,132,184,156,250,154,54,116,59,21,86,127,132,143,15,156,4,244,107,12,140,73,150,110,57,236,16,70,0,115,160,156,64,10,203,33,84,176,94,231,125,169,44,167,212,115,98,212,79,199,81,52,245,107,222,9,189,160,212,28,118,59,177,169,56,199,47,26,160,44,230,125,53,133,212,72,153,208,216,112,78,234,76,38,19,250,149,255,103,59,182,1,170,36,89,207,121,219,120,148,8,255,119,142,203,246,254,240,233,140,57,50,0,202,32,116,154,149,145,132,41,45,214,19,164,119,80,90,241,229,57,182,169,16,246,230,132,187,27,236,104,104,162,158,230,181,148,59,53,175,94,184,30,175,116,60,254,180,166,72,94,233,196,37,24,254,62,131,180,25,158,72,224,201,239,189,178,168,175,194,93,84,92,184,35,183,145,8,226,101,31,126,123,46,120,78,81,133,114,63,20,35,12,128,212,170,109,44,146,231,149,203,231,96,70,219,69,41,115,87,65,151,212,119,169,174,252,226,59,90,40,88,184,108,112,240,115,119,151,180,203,206,102,191,198,99,14,71,229,188,135,85,182,212,93,52,139,174,11,66,2,10,149,144,47,181,62,141,108,85,194,146,182,176,91,151,3,223,225,238,21,83,6,76,91,33,248,136,248,26,230,114,9,238,124,251,103,152,55,231,233,41,36,155,217,168,38,110,91,153,188,234,80,98,71,19,74,111,254,219,181,217,64,76,201,43,1,99,6,135,21,123,128,53,32,157,134,26,72,213,38,234,19,27,229,251,214,84,89,232,109,165,193,143,249,52,194,41,6,52,35,190,212,201,80,142,104,134,140,118,169,106,129,118,150,23,73,136,115,53,109,19,38,129,3,101,156,180,144,228,45,154,126,21,207,25,181,143,127,38,161,37,194,89,179,133,74,46,163,253,146,95,217,244,223,217,181,244,163,180,212,193,178,244,184,180,21,175,252,45,191,24,69,39,82,180,0,49,249,228,94,94,146,53,2,30,8,56,105,58,96,182,107,72,131,124,218,53,138,169,242,214,49,99,14,211,191,118,158,66,204,74,208,213,181,79,128,223,247,74,203,130,110,248,133,79,59,107,168,243,22,156,103,53,194,35,29,111,200,216,156,91,21,50,60,194,248,15,255,109,174,36,132,110,69,76,180,34,171,110,15,144,122,56,160,128,36,190,218,117,183,116,22,232,102,23,63,119,25,49,228,240,103,221,97,49,177,152,99,37,181,31,147,75,80,130,78,224,9,122,244,83,0,251,26,253,161,153,126,109,33,71,129,207,78,163,91,154,62,159,15,213,236,255,77,203,3,222,51,178,211,29,199,26,126,170,37,199,75,2,71,41,237,9,215,73,82,30,180,87,242,80,210,25,111,3,250,186,167,186,73,82,190,155,161,237,112,31,42,3,236,167,152,197,44,38,205,5,201,100,144,143,35,88,247,232,176,150,26,2,118,125,221,118,41,141,31,208,9,31,235,64,255,1,136,208,215,70,236,28,77,35,253,178,65,163,125,135,126,108,254,213,56,103,225,70,62,172,113,14,244,72,60,226,233,204,92,112,175,42,144,143,211,130,126,176,196,183,227,101,12,70,55,85,220,139,136,130,226,0,19,83,16,89,127,103,11,246,37,8,128,78,58,211,175,163,24,184,254,177,154,185,163,104,38,92,84,93,41,80,20,4,236,106,198,132,106,91,165,205,152,17,23,91,126,125,173,155,20,13,42,196,155,220,209,60,128,239,142,140,228,222,28,105,187,19,94,179,158,244,115,41,210,106,67,53,5,36,65,68,182,240,176,102,107,227,194,239,250,34,244,35,72,147,179,74,106,114,90,11,85,244,35,218,203,97,149,75,44,209,246,13,251,129,151,118,45,184,64,90,138,68,212,57,2,4,81,95,180,117,20,127,52,180,187,21,107,112,161,68,86,108,153,118,236,71,82,19,141,113,144,66,182,145,20,65,73,14,104,221,26,24,98,23,18,140,237,151,37,243,154,10,47,32,13,194,202,210,233,174,54,15,213,187,239,162,85,28,111,91,194,195,181,77,63,247,97,10,150,133,63,20,60,88,28,237,158,64,144,102,174,222,12,21,213,45,114,185,243,132,25,151,176,229,230,184,205,159,156,45,215,145,247,248,2,72,203,174,47,69,0,1,88,255,32,63,213,174,7,140,13,195,140,245,33,193,206,228,95,229,221,111,252,225,255,163,44,49,115,134,156,154,103,54,180,148,37,156,62,162,72,208,231,221,159,54,120,161,2,101,143,17,134,117,11,110,247,121,237,44,170,35,234,187,250,52,224,16,249,130,14,158,246,159,47,175,102,183,20,62,139,209,135,218,51,134,123,76,248,179,57,76,32,51,105,150,142,252,204,198,24,235,48,2,53,124,4,135,89,221,79,225,41,251,64,44,226,212,157,111,144,252,22,36,116,195,128,112,252,221,204,29,101,248,223,176,153,244,102,2,102,213,138,221,88,191,250,124,128,70,47,193,57,157,91,11,164,238,237,184,67,187,128,73,228,3,66,195,248,23,211,73,232,69,19,47,88,248,202,146,168,11,158,198,0,111,50,30,178,20,36,68,28,194,48,228,6,227,178,254,244,153,32,91,208,154,159,55,84,134,233,118,169,177,164,116,216,136,175,20,116,246,53,218,101,143,117,247,192,124,85,223,88,53,175,0,104,109,171,122,213,162,4,69,234,37,127,122,135,246,122,93,12,71,176,117,88,253,136,177,82,55,16,33,187,177,66,39,167,232,209,185,135,108,154,82,174,152,183,163,241,118,143,41,225,6,41,203,1,40,106,118,59,20,35,31,110,22,57,127,72,254,133,84,48,11,60,223,83,111,249,110,5,205,248,23,72,227,66,60,154,64,132,208,64,148,151,179,179,58,244,145,90,31,130,228,196,136,250,250,9,34,103,195,151,98,103,92,117,148,174,60,137,60,6,82,93,182,182,88,87,168,110,236,61,1,165,61,188,122,35,70,217,231,64,138,93,201,163,47,22,219,4,2,40,177,229,153,27,118,0,113,214,255,210,225,248,238,201,119,67,62,29,150,252,203,129,48,221,243,247,75,25,120,118,21,47,192,236,41,221,21,110,69,248,3,213,65,151,22,170,47,55,75,75,104,13,243,124,213,39,75,109,47,193,101,23,232,17,86,164,216,58,134,113,31,79,65,226,147,26,208,156,190,91,16,187,133,103,158,17,31,49,3,169,37,29,51,187,203,72,226,141,131,208,139,82,114,247,115,187,251,89,206,58,122,236,159,250,247,44,254,174,135,61,187,40,46,132,204,72,28,199,239,38,64,37,211,238,159,248,205,55,104,64,96,56,46,119,43,215,44,15,96,89,11,180,166,51,63,98,156,115,81,83,128,251,93,42,91,214,127,75,183,61,15,135,85,124,73,215,32,255,240,197,251,37,174,117,184,90,75,155,78,53,63,208,168,105,66,64,240,130,253,100,202,162,164,238,155,183,156,10,16,211,118,45,0,204,139,43,188,65,68,22,9,174,248,96,240,111,155,186,134,61,2,88,182,135,203,65,178,126,213,136,3,194,223,79,1,24,110,219,146,156,7,29,211,232,50,248,167,87,130,38,25,164,10,6,10,143,77,36,170,129,147,176,107,52,10,201,157,48,51,17,220,67,7,191,195,45,70,162,166,8,40,175,38,157,5,248,37,58,145,114,102,229,84,95,28,118,152,127,204,33,117,5,15,17,36,111,219,149,132,66,218,73,138,231,98,186,201,139,195,234,102,111,66,86,96,62,92,29,13,176,63,163,60,134,253,48,73,248,105,28,117,163,245,226,55,7,88,9,160,137,62,34,133,9,197,143,151,229,237,15,172,39,140,111,23,226,229,52,85,210,78,208,146,69,20,226,71,106,78,147,16,179,77,76,39,36,35,149,127,70,161,70,17,23,5,130,63,97,249,54,21,198,127,101,221,154,169,113,236,124,31,219,155,39,85,255,215,241,39,2,208,162,80,13,4,107,29,193,236,46,18,225,80,246,65,255,80,198,167,139,88,161,47,72,55,189,6,144,250,120,82,35,68,224,183,204,117,130,74,176,201,172,29,155,34,199,164,136,68,228,148,145,133,72,215,29,141,251,206,214,61,81,252,18,3,112,86,228,213,20,163,168,128,95,165,22,62,124,10,62,136,100,171,58,37,161,79,205,51,225,245,73,199,74,173,34,112,124,197,137,199,189,89,114,188,236,44,235,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,113,95,109,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,3,113,95,99,0,0,0,16,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,16,179,110,244,26,187,222,193,109,106,79,94,71,173,135,192,1,211,58,27,45,81,71,158,234,164,50,97,40,82,26,125,7,136,175,181,212,14,232,145,7,202,158,176,255,232,149,178,138,74,176,226,59,92,232,56,114,58,143,25,68,107,153,148,10,84,170,181,9,44,52,46,34,174,88,80,143,85,245,96,248,28,248,24,152,148,115,192,26,63,86,61,55,235,26,25,41,242,157,219,105,47,225,91,218,126,216,60,226,18,84,8,5,200,4,114,63,225,87,232,4,52,37,247,115,110,160,165,35,21,208,20,113,227,155,171,240,137,126,178,63,220,71,75,97,140,211,117,31,169,225,250,165,147,65,224,81,179,137,61,27,45,172,75,190,155,194,51,243,86,146,223,104,102,48,26,224,91,69,133,122,40,89,110,189,228,249,26,46,191,121,208,15,108,44,215,248,26,184,67,196,14,65,25,124,255,194,60,202,213,243,173,172,90,210,47,194,222,28,71,28,2,166,28,44,2,0,0,224,39,235,195,135,34,225,114,243,144,208,103,80,186,176,2,3,109,139,160,112,83,64,99,194,229,156,200,0,243,138,232,241,138,183,125,35,164,73,181,137,108,170,224,69,62,103,61,71,94,12,161,145,132,219,152,220,211,74,41,38,121,80,74,27,133,13,80,60,199,209,8,122,95,82,129,157,18,168,158,69,90,93,23,70,239,16,24,157,7,181,207,37,112,19,112,15,227,138,29,66,133,112,188,112,47,101,151,149,30,81,94,96,197,187,78,200,213,173,49,168,67,166,10,30,15,98,36,134,100,20,134,105,18,152,124,151,53,148,43,35,149,83,15,66,213,237,103,179,245,122,58,109,4,174,190,12,40,114,197,101,161,154,234,238,211,40,250,57,231,69,240,56,149,59,148,105,179,52,70,47,129,90,226,175,144,3,3,14,212,83,180,49,248,50,174,80,58,222,217,16,226,183,25,72,1,19,252,6,142,236,225,250,68,166,22,179,179,212,147,32,239,217,75,234,50,167,94,238,115,150,140,44,47,243,85,22,118,194,122,96,172,31,225,121,33,117,240,191,74,67,161,22,0,0,0,7,113,95,99,95,102,102,116,0,0,0,68,194,82,223,29,102,119,10,75,32,27,76,125,128,89,128,28,254,131,181,64,250,230,178,103,145,114,105,114,250,227,26,21,93,102,220,126,14,29,198,105,253,25,22,198,116,84,0,34,68,154,200,240,59,173,44,168,80,180,101,69,243,176,57,51,241,220,191,129,58,243,19,219,172,24,49,61,248,20,98,150,124,118,9,203,195,86,74,166,149,144,105,192,38,213,187,67,99,185,133,191,68,246,197,81,247,241,16,186,139,65,102,134,71,2,169,212,163,152,239,56,7,255,6,201,55,35,128,16,168,83,191,170,23,117,199,20,215,22,143,255,73,18,32,240,224,146,40,227,124,97,25,52,233,126,189,4,37,13,165,11,171,145,187,8,39,197,70,136,233,9,172,108,190,109,21,168,245,149,117,214,16,150,108,82,210,54,176,17,203,22,143,36,43,34,68,127,21,199,186,167,239,32,12,38,230,158,130,248,157,204,39,116,253,14,179,218,174,42,2,172,69,164,133,69,109,43,123,253,115,69,133,72,147,62,76,171,9,155,116,9,154,178,230,73,6,233,120,33,27,247,115,102,204,196,187,2,25,148,101,22,97,194,93,207,194,230,208,4,181,3,41,249,10,53,111,172,155,229,154,57,194,195,199,72,75,69,143,90,91,15,204,7,122,151,55,89,231,245,94,26,147,169,82,230,18,123,24,154,43,60,7,187,43,149,158,245,205,12,43,67,82,91,161,120,98,161,167,88,111,105,155,105,226,32,32,217,77,6,66,96,39,163,208,149,59,102,13,183,175,191,126,67,60,222,226,133,5,47,132,196,218,54,109,195,51,25,177,37,176,58,113,27,130,9,175,30,115,118,0,243,218,198,251,72,168,253,84,143,231,249,1,123,24,235,96,203,110,81,213,57,43,165,47,209,162,74,19,204,129,60,28,93,218,104,139,81,180,138,152,86,158,59,172,207,128,194,35,86,236,199,134,95,210,23,172,224,16,142,126,86,183,154,108,68,67,27,153,52,179,56,78,172,221,86,110,219,47,71,113,13,166,164,19,237,124,152,62,219,141,128,236,193,59,15,91,178,50,168,82,72,62,255,95,232,233,190,25,255,175,39,255,6,41,159,129,203,122,201,6,216,182,204,153,60,129,192,107,205,43,241,188,66,114,121,170,18,105,128,116,197,74,141,183,13,221,190,59,104,36,216,170,28,17,109,200,152,185,83,69,181,163,13,242,50,70,215,90,64,44,110,250,203,248,99,216,166,163,186,23,196,6,90,126,201,61,244,86,106,24,222,87,152,39,18,159,47,52,12,199,190,185,251,176,86,239,242,169,17,228,68,242,30,29,8,22,226,46,20,77,72,71,250,139,83,253,3,203,35,14,48,46,70,171,247,81,207,59,142,140,166,41,4,144,84,38,185,163,90,83,183,205,24,17,190,56,42,142,251,208,75,188,148,62,62,127,132,215,175,121,207,198,39,55,160,79,140,22,64,65,6,151,137,136,49,74,110,105,76,134,229,87,22,207,3,225,231,36,15,138,65,9,45,195,127,200,253,11,143,133,165,127,238,203,5,255,227,225,39,20,165,234,233,235,4,137,236,168,101,211,55,248,242,189,236,44,134,79,78,189,233,54,1,230,140,32,66,228,17,209,210,25,147,103,220,175,83,102,17,45,174,196,74,104,179,134,77,205,157,233,29,165,248,121,116,186,72,146,141,171,194,171,27,167,216,164,57,158,93,167,48,131,117,22,40,94,145,132,208,119,176,37,194,181,29,135,135,6,129,2,150,248,122,83,108,108,214,245,220,52,82,70,95,18,150,96,6,234,25,110,26,36,155,217,6,131,6,81,33,27,14,181,42,232,242,0,5,243,240,172,132,160,24,7,27,24,56,148,147,207,141,59,200,178,151,58,142,210,81,94,38,152,227,129,160,27,117,51,98,206,178,141,18,62,14,241,254,242,93,60,3,31,129,170,74,46,178,46,92,4,166,210,199,108,186,151,170,254,252,186,72,251,163,255,237,39,54,67,32,191,12,254,209,40,93,35,195,126,243,117,129,244,160,73,250,223,234,29,140,95,152,72,117,112,156,188,48,234,54,193,57,3,146,33,5,98,203,191,6,57,173,12,39,62,100,247,8,66,154,222,145,58,149,115,72,139,112,54,73,7,55,225,93,14,233,16,146,12,41,2,73,168,63,203,64,236,106,6,215,60,12,59,125,250,137,157,225,254,150,217,245,115,52,167,96,213,139,239,254,135,17,204,244,89,159,163,42,185,35,235,87,240,183,34,1,114,29,239,124,216,85,84,96,88,57,32,229,163,110,54,101,6,61,158,155,157,95,179,89,116,10,20,32,215,22,190,222,16,227,17,227,84,18,240,205,71,70,175,188,9,110,63,200,22,46,8,165,44,212,114,243,213,164,223,136,181,94,47,232,212,176,78,233,18,158,177,24,78,48,97,184,64,148,99,160,0,93,80,250,178,158,161,17,103,101,79,42,155,60,227,200,145,179,169,46,68,203,200,245,23,93,155,178,198,199,160,94,12,78,66,152,170,121,174,189,10,49,46,181,110,45,60,192,34,121,185,203,95,255,248,115,162,8,146,50,110,107,218,179,97,199,87,57,151,50,52,140,249,219,100,80,252,132,52,254,37,184,229,38,113,241,29,216,209,65,247,60,132,149,146,191,25,49,176,75,144,175,157,86,219,24,87,117,105,19,97,48,40,75,167,135,100,2,72,228,51,11,159,128,104,58,161,231,237,237,201,44,72,104,135,196,67,100,198,212,63,181,160,242,13,248,86,188,4,39,247,60,1,25,185,69,30,224,56,203,37,92,118,3,86,65,97,74,182,169,50,162,137,125,111,168,126,224,152,21,189,40,60,206,212,16,57,104,141,222,191,78,149,143,172,17,79,185,122,50,239,70,162,155,101,233,137,136,129,135,132,246,172,115,121,40,162,89,57,10,227,0,100,142,209,113,215,173,123,85,94,93,15,198,160,167,23,5,168,16,112,187,87,34,93,123,216,10,106,77,188,54,20,215,120,133,79,195,78,195,142,222,25,175,198,18,29,231,67,29,65,42,244,35,156,188,95,63,171,50,149,27,160,5,96,236,91,4,180,107,246,254,40,63,46,98,62,209,161,91,58,13,201,169,133,20,78,54,217,130,173,59,136,5,28,206,60,255,173,74,165,191,32,177,165,93,195,153,211,19,162,83,59,18,133,149,192,210,221,187,37,105,211,219,238,6,32,189,56,111,196,19,51,117,208,124,53,105,69,188,234,112,38,219,93,154,205,3,162,77,112,122,136,85,119,201,227,4,233,25,134,154,112,179,180,106,202,166,195,245,212,16,15,50,64,245,8,151,74,107,239,238,212,129,156,216,53,161,133,3,104,177,180,115,250,213,199,172,150,43,30,178,102,100,35,64,161,111,114,19,6,184,74,58,82,247,202,0,129,61,24,84,236,249,216,126,15,239,22,215,7,127,174,194,104,120,140,34,191,51,185,46,176,226,11,255,24,139,61,250,252,101,20,35,242,18,193,115,129,244,71,0,250,130,53,136,175,237,22,87,3,249,14,103,249,47,172,233,63,133,148,237,205,151,202,95,34,203,82,211,147,113,96,156,3,36,50,128,243,37,111,122,182,52,249,223,13,55,52,196,10,134,13,83,52,247,46,88,220,139,140,46,71,86,171,174,92,145,134,38,81,64,144,44,239,228,211,160,255,38,240,178,49,186,198,31,83,200,125,95,114,75,226,81,72,40,87,216,179,181,152,216,113,156,96,51,204,212,180,119,252,200,111,19,24,175,115,253,128,212,160,48,221,164,239,13,181,27,199,193,180,243,189,67,169,225,123,223,200,193,209,255,189,204,99,51,243,7,166,1,128,212,192,81,245,93,28,154,202,172,194,57,94,130,237,120,142,205,86,178,241,34,46,208,132,233,59,181,91,143,104,92,238,202,123,38,42,167,119,135,77,235,57,76,7,104,221,249,27,79,156,203,190,253,155,71,241,72,194,210,17,122,91,98,182,79,249,30,57,192,225,87,20,205,211,123,241,193,217,136,212,71,26,244,63,100,121,48,7,220,121,55,109,106,97,199,208,100,158,49,22,100,113,72,184,204,156,49,104,119,85,227,78,63,88,63,21,12,139,185,138,235,159,149,84,113,128,30,92,133,44,52,233,45,183,34,216,7,56,130,183,76,235,16,38,252,199,143,151,191,80,173,23,3,168,174,136,104,55,228,14,148,188,35,213,71,248,55,45,77,40,54,157,187,20,48,250,139,6,185,155,163,177,165,159,212,35,63,90,138,96,1,14,116,141,62,59,21,2,30,128,157,205,223,51,205,123,92,122,245,160,231,134,82,122,139,194,139,53,106,57,142,43,112,197,170,182,61,3,29,230,235,251,171,80,157,202,214,224,88,251,10,219,220,162,196,196,82,26,59,208,29,130,201,230,47,242,122,232,34,177,26,12,4,71,233,254,227,111,240,115,33,141,6,24,128,223,206,2,77,185,45,42,16,138,155,51,253,162,109,29,68,141,114,162,96,208,239,236,125,43,73,105,154,120,111,239,223,29,74,153,165,250,188,67,159,46,170,43,195,157,140,47,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,113,95,99,95,108,97,103,114,97,110,103,101,0,0,0,16,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,255,255,159,56,104,44,89,83,154,193,62,43,237,248,109,92,140,242,240,222,70,221,204,94,190,15,52,131,239,20,28,0,0,0,7,113,95,97,114,105,116,104,0,0,0,16,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,70,27,90,38,177,171,158,221,170,147,13,198,54,138,226,204,148,110,146,73,81,119,23,12,222,161,93,246,226,79,8,91,230,123,248,159,182,156,214,49,187,48,5,103,36,61,189,167,16,24,80,140,231,118,215,34,213,39,141,132,202,163,4,137,121,231,101,175,33,111,169,223,62,112,41,6,254,64,71,124,137,233,55,235,17,25,13,176,224,147,137,219,71,205,39,205,168,128,18,254,168,125,116,153,20,98,36,177,85,53,193,1,96,12,91,39,168,140,160,226,193,125,211,156,20,251,43,156,83,222,104,131,2,198,21,93,179,177,226,126,241,208,80,37,246,3,172,255,57,97,165,77,154,69,161,203,236,114,46,157,218,8,34,87,46,68,177,231,199,49,50,66,181,65,252,146,198,17,108,50,21,218,186,139,154,197,176,227,130,39,47,106,66,151,84,171,114,121,237,97,31,241,72,220,186,220,85,94,64,58,151,129,188,248,51,255,32,126,53,119,0,140,28,3,0,0,208,187,224,165,203,179,81,44,109,217,184,155,120,23,9,132,132,35,209,240,40,125,224,148,163,88,235,44,49,96,191,7,137,39,174,246,19,165,44,18,155,104,127,8,254,126,33,186,122,189,160,153,36,244,179,149,126,86,6,110,26,165,25,132,7,96,73,99,41,206,68,207,250,152,219,194,66,88,239,231,175,115,24,137,40,221,42,216,114,123,53,92,27,181,200,242,96,105,10,9,122,15,217,245,201,5,120,46,123,2,222,161,210,39,74,120,128,142,91,96,89,219,147,215,17,52,87,127,221,149,76,100,207,247,91,87,85,151,146,254,102,91,248,116,38,143,157,195,23,71,222,179,13,214,57,105,36,41,106,71,160,31,178,103,146,103,134,20,151,78,81,91,101,115,171,244,205,16,59,254,245,240,9,91,31,214,34,21,41,100,37,247,205,60,199,157,146,169,168,135,71,6,51,242,43,202,145,111,21,132,48,118,253,157,5,108,48,143,203,60,33,61,183,69,168,46,25,168,231,61,234,219,1,134,95,248,25,16,186,159,94,228,220,150,0,84,141,173,176,33,179,126,33,0,0,0,11,113,95,97,114,105,116,104,95,102,102,116,0,0,0,68,97,105,132,245,126,73,66,113,7,136,146,97,207,227,18,118,119,191,135,10,54,163,151,208,249,157,129,159,132,121,115,82,215,137,149,196,15,142,48,224,2,124,174,234,58,246,185,29,105,138,46,82,158,178,15,191,250,236,19,18,102,70,236,60,9,121,148,91,198,82,111,183,41,209,149,137,85,190,69,213,7,180,70,137,29,60,254,157,16,156,47,250,36,48,183,43,116,210,61,120,88,131,114,218,40,115,22,1,250,232,91,124,50,122,89,154,216,162,93,65,18,174,245,24,107,112,64,84,135,216,181,1,33,208,105,102,77,209,83,17,0,7,14,72,153,157,64,76,119,177,178,202,235,66,229,200,141,76,35,34,180,230,75,47,86,82,65,79,103,147,111,32,111,107,1,111,200,107,234,105,172,5,242,8,35,229,192,92,241,118,234,59,201,6,199,122,236,188,113,73,54,192,166,206,63,211,21,102,109,237,171,250,248,105,171,21,234,62,16,2,108,28,125,33,49,103,1,2,147,49,197,224,90,244,183,124,4,87,39,75,118,218,145,114,145,107,167,66,115,60,133,148,192,148,157,10,162,1,14,245,226,233,10,230,41,151,74,228,60,227,7,100,248,238,157,101,255,56,100,86,176,11,13,116,115,91,174,86,30,190,215,153,187,154,202,112,12,134,43,79,240,169,92,135,18,141,204,26,184,70,107,20,75,129,117,193,19,110,229,56,230,29,157,56,207,210,205,50,190,177,137,183,77,23,93,132,95,43,23,53,96,17,140,20,147,9,125,70,203,31,17,11,44,141,187,209,212,247,30,98,35,56,243,66,99,129,53,59,98,249,207,225,90,223,174,234,113,116,207,107,0,3,127,57,226,51,81,50,230,165,14,88,183,116,172,129,118,123,84,4,242,73,9,23,235,220,209,98,160,143,240,219,187,50,245,5,103,211,227,150,201,66,147,218,93,249,209,185,119,70,20,29,204,172,176,26,0,7,49,183,136,65,170,110,43,227,168,64,107,31,125,171,254,104,227,35,79,169,133,76,161,42,112,166,148,153,238,253,34,55,102,199,164,204,10,12,183,80,222,7,131,74,70,71,43,135,143,173,201,139,84,175,221,64,98,146,149,131,148,224,233,121,103,242,124,85,202,243,215,34,170,14,113,89,140,21,207,117,27,154,83,174,84,106,56,124,77,140,123,50,174,19,107,94,148,16,148,145,132,120,54,112,255,35,27,157,223,152,30,150,242,163,233,221,28,176,5,95,140,192,76,115,178,138,68,64,241,163,136,186,187,224,155,118,27,93,12,106,139,11,21,94,39,45,40,77,67,251,152,23,199,99,180,147,22,131,232,198,178,65,53,16,87,237,33,161,149,14,51,230,249,238,35,72,216,199,4,147,18,150,174,212,184,148,139,133,90,247,236,60,23,12,62,9,16,65,45,175,147,82,185,113,142,147,198,255,250,44,161,122,128,2,164,204,62,189,89,40,232,222,202,51,137,126,178,252,82,157,198,1,137,48,224,224,239,67,8,133,255,9,21,147,7,91,113,58,95,62,49,179,182,99,206,146,85,90,146,11,154,52,247,197,225,2,133,22,84,204,245,142,174,103,240,139,182,22,204,236,225,20,196,16,162,0,145,71,11,173,18,238,250,64,24,215,153,57,249,60,62,246,127,216,7,53,27,219,219,128,237,165,112,218,40,138,107,196,136,224,16,248,90,241,13,95,202,29,229,21,229,39,106,132,144,110,252,156,78,177,250,250,166,117,200,112,240,144,68,225,194,21,201,99,112,20,16,138,102,43,14,50,108,147,255,39,209,182,198,165,133,127,27,174,223,62,118,93,197,180,76,140,127,60,6,21,253,154,169,190,140,31,173,5,70,0,103,254,228,222,173,255,209,86,188,16,137,229,203,95,148,177,57,255,20,0,4,158,46,140,113,40,214,144,206,95,62,196,187,91,110,177,30,225,252,26,34,248,91,218,63,254,9,212,60,49,165,17,159,85,107,173,81,163,225,84,181,33,208,28,45,3,32,38,177,193,139,140,118,109,61,212,73,215,158,175,251,134,172,37,115,9,245,100,52,199,198,16,55,32,41,159,208,67,238,11,100,156,175,9,206,87,244,61,51,155,66,62,117,97,213,220,87,200,122,225,160,161,168,36,116,18,249,0,49,135,125,246,247,78,26,233,241,60,119,11,255,22,83,143,191,248,105,24,79,240,55,122,139,206,176,123,140,56,228,134,212,173,48,183,136,109,111,179,245,201,27,37,120,142,2,220,213,15,162,113,202,151,108,105,209,232,59,62,125,33,175,40,120,107,176,208,153,78,99,97,209,74,222,233,26,74,64,114,93,90,166,23,57,175,165,138,159,128,144,124,231,61,13,39,106,83,127,222,250,115,157,121,81,176,210,203,200,29,37,159,10,178,127,96,149,103,253,105,170,20,130,200,192,62,249,41,171,110,250,211,6,222,108,253,142,240,40,57,76,228,74,106,110,181,166,109,174,153,53,198,61,162,204,197,22,85,210,231,110,213,57,221,240,250,28,24,60,16,124,203,158,254,94,234,134,76,183,144,39,83,100,72,153,144,205,195,132,90,81,101,90,210,234,132,246,119,60,9,6,149,111,66,183,137,139,131,130,149,121,149,136,223,62,234,191,155,89,54,8,20,10,243,32,69,225,149,197,161,76,103,59,136,93,215,195,20,97,143,48,62,32,187,66,161,171,119,85,210,16,254,97,75,89,33,101,147,57,128,96,217,173,206,180,246,189,193,249,127,202,109,123,90,202,51,193,185,34,187,156,131,233,41,86,85,1,132,88,187,67,54,213,24,204,141,136,220,171,64,67,46,88,229,16,233,111,175,161,132,16,83,50,160,247,12,64,49,78,232,43,47,94,131,54,2,176,116,20,115,246,214,172,228,233,23,33,201,252,80,150,106,87,13,178,156,76,90,145,58,142,141,146,31,222,188,44,243,111,250,76,85,16,69,223,30,181,176,67,250,235,249,169,69,16,38,208,106,246,225,50,58,206,14,229,1,71,199,23,84,100,67,18,187,53,96,77,87,83,222,75,20,184,58,94,112,222,234,190,239,201,88,41,68,152,159,224,234,21,46,188,231,120,107,230,148,35,106,241,84,31,239,3,59,126,99,46,175,42,139,33,211,42,66,142,90,144,223,85,11,144,52,154,248,61,32,160,123,164,51,68,119,125,224,209,151,36,58,77,187,172,208,161,155,155,45,197,82,201,169,234,5,114,149,99,212,35,181,208,26,253,146,133,103,162,32,216,47,198,151,87,96,111,55,141,250,46,156,208,78,117,110,148,93,236,83,110,30,233,147,196,65,133,70,37,136,134,123,186,146,3,55,169,249,131,210,253,19,96,68,22,61,213,58,62,54,120,252,138,74,99,19,131,21,219,211,159,82,118,47,235,126,91,174,221,179,125,224,123,9,65,147,205,95,243,83,217,30,90,27,100,40,253,251,14,137,140,113,154,75,58,232,175,219,253,93,197,18,118,209,237,56,255,17,33,27,105,69,80,124,58,113,238,205,53,243,214,92,4,13,112,153,220,191,58,209,168,157,35,121,188,17,246,184,201,28,38,71,10,141,233,13,161,127,49,215,31,90,139,70,23,238,162,191,1,249,24,86,144,225,231,170,240,159,227,233,31,191,69,11,121,90,131,165,170,90,222,50,84,214,52,37,53,187,130,161,3,213,187,139,192,34,74,99,188,114,41,25,125,198,90,20,181,164,213,77,70,215,121,157,80,165,210,98,251,56,103,107,19,139,37,204,174,53,98,249,230,87,250,195,144,103,3,77,146,215,146,150,108,155,154,48,190,143,218,128,242,141,31,134,31,104,245,188,39,195,31,94,8,32,1,103,167,66,152,48,147,253,58,149,137,236,157,33,165,152,227,32,73,255,33,45,108,177,147,99,169,115,96,98,56,219,116,115,208,159,196,42,25,80,250,129,140,108,23,15,239,16,41,52,116,68,205,85,169,116,128,197,119,123,89,229,19,179,20,133,93,54,32,43,249,70,88,162,121,191,201,206,213,225,218,223,191,177,86,40,178,246,189,61,108,204,43,255,136,4,211,232,26,198,213,67,132,119,155,121,226,178,134,240,142,249,87,234,197,83,85,177,139,229,29,157,78,156,33,106,104,193,38,5,219,205,208,36,100,128,1,54,4,58,100,124,145,142,119,76,252,3,126,192,56,185,96,47,67,43,163,109,70,146,22,180,239,73,91,81,104,102,179,233,83,43,161,215,152,248,191,105,253,223,154,21,226,250,19,137,46,251,87,219,225,219,165,208,19,99,46,10,242,226,88,105,97,81,104,102,179,202,81,98,75,221,254,138,174,253,247,52,238,170,218,249,57,112,226,212,146,172,18,34,47,103,60,136,168,162,173,192,96,131,224,20,104,122,158,159,69,48,62,134,169,222,43,171,16,107,193,168,24,40,34,11,51,237,98,237,47,161,203,29,57,239,200,86,215,240,157,11,226,165,252,198,73,210,157,197,223,114,180,127,231,177,154,49,224,40,223,250,238,214,232,129,203,172,85,7,159,166,219,223,3,195,164,3,178,135,47,89,54,166,46,121,67,152,222,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,113,95,97,114,105,116,104,95,108,97,103,114,97,110,103,101,0,0,0,16,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,251,255,255,79,28,52,150,172,41,205,96,159,149,118,252,54,46,70,121,120,111,163,110,102,47,223,7,154,193,119,10,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219,255,255,79,158,129,87,48,1,187,50,104,134,109,127,48,137,58,78,72,159,236,101,92,248,217,211,115,101,169,128,1,0,0,0,6,113,95,115,111,114,116,0,0,0,16,254,255,255,31,216,20,60,120,221,30,141,12,111,47,152,175,69,79,253,252,146,116,95,143,172,191,156,61,26,99,55,31,130,199,23,50,136,57,76,28,175,236,196,110,18,139,39,200,227,87,190,206,82,1,155,34,148,238,243,89,226,59,112,35,32,190,214,82,59,160,71,30,40,123,194,254,163,87,202,42,42,193,138,239,112,161,227,200,233,60,102,16,173,101,82,42,200,45,139,244,145,82,33,192,81,208,39,61,76,32,147,197,252,77,117,111,158,111,227,164,210,80,23,30,79,233,28,22,198,119,110,199,149,153,171,225,216,128,128,149,186,127,185,195,101,98,197,250,23,212,0,163,124,84,121,13,212,228,205,45,218,187,158,22,132,2,130,3,108,171,112,11,234,3,182,80,238,47,195,107,235,89,105,237,36,206,251,67,69,12,117,26,179,176,46,9,219,20,237,136,202,216,196,41,81,217,52,88,18,189,147,104,235,30,105,61,105,71,58,215,137,152,221,14,250,164,22,29,208,33,202,171,53,85,25,159,160,159,205,103,191,98,102,152,92,101,157,144,122,79,173,184,110,197,246,42,3,0,0,208,187,224,165,203,179,81,44,109,217,184,155,120,23,9,132,132,35,209,240,40,125,224,148,163,88,235,44,17,127,56,232,189,11,188,149,39,226,131,244,10,54,93,12,96,121,0,195,178,99,68,181,149,149,177,61,135,144,18,244,12,225,65,41,157,88,85,154,37,105,245,246,122,164,144,105,253,50,151,246,145,69,164,108,239,63,99,203,208,197,232,17,6,57,210,116,251,1,163,192,131,63,160,145,60,252,199,160,98,96,10,12,18,24,214,108,19,87,79,26,195,35,101,71,26,60,136,145,24,146,81,24,166,73,96,242,93,214,80,174,140,84,78,61,8,85,183,159,205,214,235,233,180,17,184,250,50,39,68,97,217,15,243,95,64,37,197,72,110,94,228,125,215,110,40,190,21,203,235,230,202,4,210,53,157,45,66,239,21,78,79,209,230,184,224,244,186,198,151,244,79,247,14,255,207,74,155,237,24,203,38,231,122,192,88,247,9,233,181,134,33,7,91,233,210,195,211,23,152,91,27,160,218,167,72,102,192,157,245,26,233,89,224,178,39,175,80,132,40,4,137,109,5,0,0,0,10,113,95,115,111,114,116,95,102,102,116,0,0,0,68,93,154,143,49,232,95,4,84,143,150,218,210,164,194,121,30,176,103,222,64,154,151,217,150,26,210,132,192,16,5,184,47,243,236,185,8,94,4,65,121,185,228,139,235,134,94,71,58,57,42,232,30,186,28,184,227,128,215,240,3,251,200,99,65,241,169,201,99,141,81,135,27,70,42,95,8,117,27,126,118,215,172,105,206,249,153,60,156,0,237,62,55,177,42,90,82,239,115,99,198,9,194,218,161,32,221,15,172,41,105,81,209,36,19,166,228,239,154,170,126,183,241,35,201,101,139,167,8,78,47,160,144,23,126,184,16,146,194,135,117,68,110,33,119,235,120,68,101,95,146,106,190,189,200,221,128,180,159,133,89,238,154,236,241,134,175,38,255,87,29,120,85,95,39,74,30,190,182,231,177,153,125,156,134,178,186,66,27,35,2,216,81,116,155,40,23,215,99,88,54,186,128,12,137,241,83,134,191,234,11,192,121,91,22,114,249,182,47,197,78,14,8,166,34,119,199,67,90,66,221,246,12,133,115,228,69,120,160,230,6,212,242,151,114,180,24,210,105,166,137,45,214,47,242,211,62,18,95,210,239,62,188,10,147,123,76,162,159,81,46,239,137,234,149,125,198,233,96,39,225,228,213,232,68,138,3,119,94,60,111,72,242,72,72,153,156,123,204,126,125,148,253,126,195,137,114,150,244,19,40,226,132,14,96,108,255,123,105,53,84,140,128,150,200,133,142,28,32,136,164,239,135,247,165,217,199,227,45,245,226,152,40,34,17,142,0,17,59,169,222,52,25,217,7,27,156,130,83,246,171,188,176,57,157,85,166,125,97,181,80,168,105,195,187,182,111,189,195,135,143,21,250,70,58,9,138,159,27,44,125,232,184,97,148,219,13,212,222,152,121,164,249,140,76,212,40,112,176,33,167,27,68,172,103,250,32,171,30,181,101,244,195,236,22,181,144,92,56,209,67,40,149,159,63,166,170,209,57,59,29,119,54,51,222,8,195,56,93,115,55,249,115,196,214,240,140,152,239,151,202,249,179,89,93,236,184,163,122,13,159,127,108,87,64,168,35,172,110,66,37,131,35,94,164,112,14,178,167,137,144,131,135,182,255,164,13,84,118,210,50,155,9,109,241,121,86,54,213,153,203,174,59,56,143,11,197,51,51,60,159,196,22,177,69,79,71,29,172,79,48,13,142,41,37,32,230,85,19,149,172,176,82,156,43,225,147,137,172,218,192,218,181,244,131,207,116,41,199,32,245,187,109,240,211,2,153,5,149,176,147,240,49,97,13,139,28,119,215,28,196,243,25,102,216,39,26,100,61,63,86,186,228,160,43,106,11,10,80,246,95,233,197,56,51,201,226,130,17,125,195,156,245,97,192,230,211,53,241,116,226,118,181,166,18,52,34,238,171,35,146,100,15,105,200,138,64,202,164,52,89,247,212,81,221,196,244,33,227,44,1,255,154,157,167,41,11,254,70,33,110,242,94,99,74,16,83,193,200,139,132,165,6,239,55,40,57,225,208,223,44,142,141,251,220,168,97,173,155,58,83,43,241,197,51,180,145,17,109,111,128,218,135,205,68,202,37,111,35,42,196,12,228,186,80,85,139,140,34,20,20,17,184,14,74,193,201,169,14,249,56,225,236,49,16,77,3,30,29,228,9,151,41,15,118,185,79,163,105,192,23,240,154,247,131,188,60,187,55,36,173,52,153,195,54,169,53,220,92,113,214,202,14,60,66,101,222,74,203,211,22,213,182,113,70,15,240,211,16,7,238,190,162,236,43,56,133,20,141,30,4,53,74,19,224,183,169,91,196,13,222,134,155,171,234,159,97,139,116,145,225,81,180,86,4,254,77,143,181,113,240,203,47,128,226,209,222,152,97,198,38,196,124,210,72,127,111,186,166,24,23,58,32,48,83,154,150,39,247,63,186,199,87,1,42,119,80,40,154,37,35,110,187,215,99,187,76,124,13,39,149,155,1,191,241,239,42,254,70,211,16,222,195,74,191,212,46,181,51,120,89,120,154,119,217,239,231,174,165,61,190,43,160,203,193,77,155,66,235,67,14,143,6,238,133,134,14,248,0,230,199,105,51,33,165,62,34,201,212,133,47,63,98,183,155,38,70,3,99,249,158,67,152,70,12,99,143,211,55,215,91,138,214,205,17,176,86,179,86,83,209,122,75,172,160,6,144,166,220,161,248,163,168,138,76,216,41,172,33,208,15,207,23,172,22,105,179,198,212,68,83,135,149,16,251,154,62,48,214,230,159,230,103,253,152,123,52,31,195,59,145,185,101,131,57,217,52,62,32,39,26,29,127,9,109,157,88,181,38,94,52,120,35,115,205,228,227,57,94,207,63,72,172,131,8,133,42,191,173,16,176,21,164,28,253,150,225,13,126,129,38,174,183,161,118,28,124,221,216,105,102,204,190,143,81,11,206,41,74,49,38,121,50,204,254,46,132,104,157,254,204,210,184,247,142,17,1,86,2,172,137,76,127,211,175,220,253,247,223,192,2,85,90,85,41,149,147,52,122,80,134,42,69,211,184,53,66,135,79,36,198,133,29,89,21,160,97,224,54,16,43,16,43,206,249,84,136,189,86,147,184,132,36,133,87,171,182,42,76,97,190,7,94,101,92,38,143,61,78,56,154,246,125,226,67,252,144,224,65,245,115,186,98,241,30,162,202,185,28,47,169,248,183,98,110,77,92,211,224,211,154,4,204,37,229,204,36,180,116,73,241,44,225,91,77,226,132,240,56,34,133,141,165,25,49,126,64,252,241,142,65,88,6,148,137,236,248,197,86,191,222,154,169,177,72,132,19,155,173,104,212,228,217,139,27,136,67,160,231,125,218,107,251,62,189,233,45,96,66,162,23,222,129,186,99,106,206,83,4,121,26,86,54,69,85,63,60,123,149,236,55,3,26,109,155,152,13,148,191,193,34,167,60,146,5,166,117,27,140,237,150,116,202,148,91,121,226,213,35,28,203,48,223,74,148,213,89,40,29,90,7,197,43,252,41,140,66,128,84,64,208,111,166,145,45,223,216,140,69,74,239,175,196,87,206,89,84,235,219,161,235,49,236,94,160,64,87,223,165,119,63,188,165,40,162,205,158,133,168,36,203,51,15,243,43,108,213,132,79,149,71,245,150,129,161,243,47,101,13,57,181,230,254,14,219,151,2,188,161,63,167,90,168,136,255,11,227,212,96,93,60,210,246,200,121,228,84,196,150,178,71,7,242,93,108,44,138,239,120,114,82,49,116,158,255,83,112,199,205,79,186,199,205,99,100,199,121,149,32,222,202,83,64,253,151,23,201,157,220,172,184,6,151,231,202,79,109,43,17,123,53,26,99,51,18,237,70,227,157,115,148,253,50,111,9,169,128,109,249,153,144,207,238,221,111,119,3,101,224,174,228,161,221,123,168,146,253,97,20,72,91,7,95,10,199,238,67,238,45,195,160,75,146,207,133,36,67,184,179,82,178,8,54,30,250,161,79,121,126,53,67,81,35,74,107,188,193,47,25,125,35,24,105,200,6,145,130,203,31,17,97,107,158,102,173,67,145,75,69,234,128,225,191,217,152,152,40,28,209,248,92,189,0,139,162,75,136,7,59,128,158,76,99,144,95,132,231,32,163,2,178,95,13,200,246,136,27,245,47,206,133,249,16,109,74,213,79,169,225,0,26,10,98,229,178,179,110,150,149,83,103,78,213,252,130,42,184,85,255,235,249,240,179,72,63,243,187,112,67,62,4,124,14,194,216,127,119,108,37,21,54,8,6,109,169,237,207,112,245,228,97,171,222,74,79,1,28,31,92,232,152,204,20,60,77,7,25,76,249,164,173,88,65,14,42,227,58,167,191,178,219,59,45,167,44,1,51,237,11,42,137,101,61,39,130,104,236,38,120,218,18,39,247,102,173,143,46,220,56,217,207,146,28,11,105,159,216,97,207,32,35,184,166,39,218,82,229,56,247,237,26,0,143,195,62,61,138,43,101,9,53,250,161,112,67,137,208,12,115,154,100,147,26,185,220,137,134,188,195,184,249,230,228,93,159,124,236,3,23,120,88,69,95,227,39,206,15,204,105,12,199,36,134,79,54,189,209,45,159,231,181,169,128,133,51,238,94,96,147,105,140,89,85,19,154,151,68,229,3,40,171,220,79,37,168,214,0,36,188,171,42,193,165,143,127,110,184,177,128,184,6,8,136,27,31,164,228,96,153,175,223,64,21,44,116,18,50,160,83,231,232,11,240,17,95,41,39,106,76,68,132,136,70,144,43,196,30,30,40,156,132,100,35,220,162,208,104,237,75,212,80,113,178,203,113,21,147,189,219,96,92,86,196,199,86,216,35,125,9,204,87,247,65,194,70,62,198,179,167,111,17,190,22,136,132,9,191,154,89,99,237,253,196,36,177,103,247,147,139,81,208,224,195,47,62,195,67,137,22,147,4,0,154,239,1,186,144,91,4,137,74,4,251,229,32,188,218,240,38,53,109,239,16,247,122,50,238,195,42,23,228,148,54,94,192,53,8,192,23,239,171,81,222,153,240,45,154,77,96,246,61,209,61,172,26,180,71,102,129,26,171,25,173,196,215,150,153,7,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,113,95,115,111,114,116,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,255,255,159,186,181,237,220,42,136,147,7,28,228,123,103,183,128,199,192,14,144,212,194,39,185,219,13,39,33,139,15,0,0,0,10,113,95,101,108,108,105,112,116,105,99,0,0,0,16,254,255,255,31,216,20,60,120,221,30,141,12,111,47,152,175,69,79,253,252,146,116,95,143,172,191,156,61,26,99,55,47,114,192,90,60,84,67,221,174,32,46,47,158,98,130,31,247,200,204,53,136,15,80,218,56,92,4,230,236,193,47,197,27,228,149,49,189,66,148,16,34,141,202,154,126,152,162,35,112,79,25,124,13,159,21,0,2,135,4,115,178,98,178,156,47,129,147,28,51,228,124,37,248,91,202,204,196,85,132,69,94,188,247,99,61,146,221,127,249,236,58,218,1,121,134,224,24,190,70,92,140,153,148,247,10,135,124,229,140,123,193,9,158,108,12,253,24,82,186,36,237,236,70,67,102,152,102,60,15,85,147,114,157,111,197,249,50,181,100,112,46,85,202,191,208,212,63,219,56,187,115,2,29,223,223,46,52,49,154,170,17,202,134,84,224,242,240,119,164,62,90,17,155,168,229,91,220,238,11,151,230,90,110,72,120,112,148,224,222,162,252,247,46,153,121,185,36,165,232,74,16,184,35,142,148,130,89,186,10,0,217,18,139,154,0,157,116,95,145,118,215,127,138,60,36,4,0,0,192,79,214,135,15,69,194,229,230,33,161,207,160,116,97,5,6,218,22,65,225,166,128,198,132,203,57,145,49,143,63,165,179,63,178,4,149,112,66,138,219,229,101,20,49,148,139,75,249,166,245,117,127,205,155,75,244,176,30,159,20,30,106,206,34,229,86,179,101,149,22,216,116,248,45,68,224,106,151,134,245,205,117,160,110,204,59,240,15,131,234,43,49,128,108,227,188,175,120,188,75,53,166,236,180,242,99,238,201,160,96,29,68,36,104,208,190,60,101,87,223,249,199,131,23,67,185,163,99,250,96,234,56,10,244,211,236,204,38,42,138,240,75,132,104,100,139,43,203,60,89,238,122,218,231,39,33,172,108,141,82,36,48,232,16,220,11,73,75,243,29,116,87,136,24,166,72,251,209,77,155,74,192,2,173,65,180,185,30,56,121,171,255,52,250,75,227,227,134,97,88,232,234,11,116,203,164,107,28,18,29,88,248,226,171,130,227,66,160,208,49,104,134,70,203,238,12,151,51,217,76,43,229,197,142,121,29,93,127,110,246,27,69,179,67,202,14,187,9,243,195,39,12,0,0,0,14,113,95,101,108,108,105,112,116,105,99,95,102,102,116,0,0,0,68,169,141,193,177,252,167,249,183,151,115,219,154,20,114,92,17,201,181,138,249,177,228,210,142,109,8,8,237,29,163,212,71,144,42,209,95,62,115,18,235,136,102,158,33,244,234,72,74,0,86,179,112,118,192,192,162,55,182,202,110,60,86,6,7,47,223,66,146,12,253,123,182,124,225,51,154,218,97,71,192,102,183,6,56,130,36,186,120,155,150,0,2,57,230,152,86,109,226,47,125,253,88,146,222,214,6,201,240,87,19,130,16,149,0,107,177,4,247,137,165,243,163,110,222,160,6,201,15,54,53,180,158,23,32,4,28,230,53,52,47,142,197,170,223,101,173,74,239,171,106,171,115,140,169,226,6,98,202,6,16,75,46,42,220,72,13,34,12,150,12,220,228,20,126,236,3,80,171,3,7,4,217,51,141,233,217,197,85,145,199,199,55,226,174,13,2,136,117,50,219,136,88,81,125,75,42,93,131,57,97,55,168,75,54,120,252,152,5,5,168,214,161,200,14,101,64,140,51,9,2,48,147,118,191,30,228,71,9,150,4,221,195,153,79,203,30,198,181,182,206,231,75,209,171,86,28,243,170,204,225,205,160,145,112,85,201,110,59,193,49,236,104,51,154,107,221,226,245,231,86,109,232,7,244,235,129,200,45,34,125,145,40,244,128,89,42,49,125,152,86,218,0,161,63,79,60,231,176,132,4,6,193,209,123,143,45,255,160,37,22,158,80,169,121,32,27,17,198,97,81,202,181,218,206,238,212,206,127,20,64,135,144,110,175,180,240,11,211,183,161,141,52,211,104,158,129,172,233,22,213,48,72,240,199,206,245,114,64,99,215,43,133,206,68,83,46,6,232,32,4,23,1,31,11,74,123,19,33,31,78,137,199,219,216,95,128,165,125,197,99,205,109,238,5,56,37,116,175,0,232,120,112,211,42,13,31,128,194,107,120,91,160,85,64,149,152,194,49,48,213,185,152,112,134,106,111,231,134,196,91,54,1,135,229,254,61,186,86,98,94,120,120,25,43,252,104,230,211,254,79,166,91,37,34,68,7,233,58,129,190,65,109,124,76,220,116,137,109,41,72,243,231,233,62,39,148,51,99,100,120,206,42,146,40,70,160,251,67,156,40,170,144,124,138,57,133,106,251,161,7,255,48,30,1,173,77,6,196,65,239,11,201,173,180,240,7,109,121,252,125,77,62,24,228,147,234,150,21,246,224,147,142,171,0,94,198,26,116,215,207,251,103,242,182,235,13,78,75,242,246,196,168,191,223,34,137,236,40,75,18,58,221,177,51,116,74,102,114,160,186,228,27,239,251,126,203,71,52,16,30,88,166,32,156,7,29,194,34,255,194,171,18,198,181,240,200,191,25,236,91,80,190,241,94,246,195,1,169,175,114,248,26,219,91,64,15,123,16,214,248,30,30,92,29,221,187,91,136,28,70,151,15,252,230,163,103,228,235,245,127,79,215,226,65,201,153,70,243,150,13,62,25,10,67,161,81,49,127,94,13,235,61,236,62,77,238,27,20,22,215,192,188,24,142,158,162,245,107,80,144,255,253,62,125,164,66,143,238,113,75,49,116,15,35,132,10,221,91,222,212,119,51,63,15,11,120,20,149,189,20,89,145,113,84,66,55,187,122,55,152,98,83,14,237,1,40,192,160,32,7,7,161,5,110,178,52,211,161,57,68,243,135,211,185,177,65,179,68,60,64,18,52,133,83,21,51,200,19,64,49,164,2,101,161,151,85,51,135,48,36,239,88,109,178,98,155,63,164,199,8,93,184,142,157,234,154,91,35,250,46,124,179,21,86,6,219,91,246,5,68,157,60,28,95,231,188,63,36,84,142,0,165,255,105,205,211,179,0,235,11,235,71,208,30,172,250,203,45,159,171,92,204,236,49,111,189,145,187,251,89,65,36,150,157,109,137,12,246,135,177,192,130,65,47,134,90,109,203,60,38,88,219,100,254,137,229,52,108,210,172,218,12,39,192,4,249,231,230,242,6,128,120,2,225,187,58,45,58,167,206,114,63,253,145,181,191,195,1,105,149,120,43,133,83,201,224,133,200,122,77,154,3,80,76,53,252,160,67,226,0,215,101,150,1,157,83,245,122,43,186,80,96,7,145,165,172,66,174,143,222,15,33,176,53,106,216,247,227,6,67,91,145,7,24,33,68,145,112,89,207,123,182,175,122,250,23,36,194,85,215,74,236,7,232,8,71,149,109,45,222,175,14,130,57,214,129,41,106,158,223,128,96,79,151,146,58,16,69,18,32,164,85,248,46,51,247,151,11,252,51,170,249,229,88,117,251,69,118,77,116,102,202,41,93,51,110,203,86,23,190,56,181,114,24,97,93,71,203,237,179,220,166,56,110,45,90,118,195,18,244,182,129,90,193,74,91,77,67,18,128,118,107,36,216,78,122,249,214,240,113,129,74,182,54,40,67,23,41,249,74,200,26,27,139,252,243,37,36,218,10,117,3,56,108,226,70,115,181,151,157,204,40,28,82,213,99,14,15,213,93,159,5,128,88,139,236,13,191,191,240,187,97,192,254,91,241,61,2,248,109,164,21,210,4,186,105,253,112,106,127,51,18,8,153,95,53,250,62,158,160,57,37,228,224,146,7,189,191,68,12,41,170,95,57,31,175,15,192,203,37,82,225,119,88,27,163,28,242,169,199,32,237,134,170,25,199,44,12,59,42,201,98,110,219,251,164,197,128,25,94,236,20,145,90,52,17,74,163,114,151,136,98,22,245,53,221,49,67,162,65,37,70,14,75,205,135,96,173,152,109,14,183,45,170,208,144,108,73,151,58,206,92,122,16,113,158,96,241,44,126,42,210,3,196,4,119,196,116,132,94,227,17,236,40,205,143,122,20,163,32,25,210,49,188,8,208,244,49,91,201,213,129,183,81,160,197,228,37,201,189,250,136,158,100,44,87,161,206,67,204,240,31,68,198,90,232,57,192,210,216,158,7,153,104,182,164,67,94,104,142,182,154,102,53,252,246,194,248,248,239,160,157,34,35,220,74,16,119,234,217,106,245,105,234,100,189,209,177,229,48,186,184,224,69,83,86,240,130,215,184,237,119,190,62,146,25,155,154,102,69,38,249,233,126,185,128,205,76,146,193,32,22,125,220,73,64,44,2,146,39,217,253,215,113,192,95,30,21,224,139,195,96,190,151,110,90,225,103,240,236,92,64,115,218,97,84,191,60,50,123,162,222,252,212,90,131,206,95,156,74,72,176,233,119,36,186,137,240,210,170,238,81,155,252,100,3,140,242,201,129,55,80,250,135,5,93,206,64,8,206,106,78,254,138,58,236,220,41,25,77,175,132,163,107,93,58,152,138,170,85,143,193,84,20,57,13,217,77,166,60,59,5,39,77,189,48,155,202,102,78,75,64,54,191,245,26,32,87,10,84,237,213,217,171,215,238,147,39,130,114,144,109,170,199,251,21,172,147,219,16,250,1,130,103,173,167,157,40,175,194,214,70,121,143,246,25,182,63,176,217,197,207,255,176,144,205,110,40,236,39,59,0,37,238,117,40,106,93,31,129,11,1,243,233,49,44,4,125,117,133,171,228,218,167,236,224,55,58,89,74,214,96,220,128,0,43,191,255,23,45,21,23,230,74,188,27,5,209,84,154,230,110,15,115,51,251,151,235,101,162,162,85,186,243,207,3,98,196,211,146,240,39,46,221,92,203,40,207,3,93,7,95,202,167,253,91,38,123,106,76,103,25,243,40,113,211,222,145,174,200,214,214,163,73,202,216,254,82,196,77,166,37,10,238,198,207,0,239,17,50,14,38,201,219,91,13,164,103,5,154,172,203,65,163,203,58,102,33,171,40,190,214,184,18,241,115,9,102,131,70,18,231,147,143,162,177,219,67,80,58,18,25,155,10,223,188,152,219,128,80,66,196,58,129,167,182,24,65,29,94,97,202,75,142,152,60,36,36,208,75,144,155,108,37,145,247,1,250,220,142,153,122,228,206,184,35,46,234,43,253,239,251,46,36,196,10,160,162,160,31,74,78,80,24,91,153,129,157,115,176,113,115,18,36,3,237,221,116,123,216,253,250,40,228,189,90,0,195,199,3,27,237,12,55,246,139,19,253,79,158,21,238,189,244,42,18,48,37,62,213,132,153,103,127,5,77,208,97,198,124,124,239,7,105,123,67,168,51,1,88,175,159,144,173,51,55,235,83,107,19,239,100,208,246,119,192,177,105,125,31,212,199,24,82,27,17,226,69,2,102,13,204,126,222,198,12,231,34,145,176,209,251,160,5,238,92,79,122,121,146,58,110,233,170,173,175,83,194,50,0,191,40,5,162,197,6,185,206,218,249,169,173,151,228,76,35,161,95,149,114,127,129,144,216,0,11,132,64,207,73,137,19,26,181,234,6,98,186,241,238,46,206,2,33,157,94,58,229,184,66,222,61,172,235,139,36,132,25,87,230,178,219,145,50,211,2,231,8,157,65,48,241,0,42,24,203,77,162,54,97,176,77,248,44,248,229,168,18,227,88,126,7,179,1,236,93,182,250,108,1,244,46,233,38,81,108,228,56,36,149,35,117,71,237,167,13,38,70,221,111,105,2,90,240,227,239,191,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,113,95,101,108,108,105,112,116,105,99,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,255,255,239,214,233,131,137,84,85,244,166,177,90,120,158,229,198,64,57,126,51,67,41,87,152,227,167,232,152,149,29,0,0,0,5,113,95,97,117,120,0,0,0,16,253,255,255,47,68,31,90,52,76,174,211,146,38,71,100,135,232,246,123,123,220,46,15,215,130,31,107,92,167,20,211,14,98,185,157,70,32,77,110,65,146,111,153,205,178,121,23,38,174,65,173,65,204,158,25,79,36,26,216,127,161,35,26,20,167,109,140,55,182,146,247,225,96,169,185,132,68,5,73,141,23,25,236,169,22,68,204,130,250,43,78,115,165,176,130,4,58,249,173,113,54,167,41,48,102,196,113,76,95,232,247,246,123,161,82,11,134,75,28,78,7,37,157,229,162,35,164,27,183,21,74,65,49,133,37,120,198,232,3,254,132,235,141,160,208,14,182,184,66,230,152,239,134,217,62,160,207,54,15,33,208,106,70,36,91,136,113,98,254,29,112,81,192,144,201,80,187,79,243,5,139,141,155,76,153,241,97,36,29,40,224,8,224,92,122,199,118,215,32,124,33,107,164,146,183,9,79,56,110,2,25,227,19,120,215,250,77,65,85,5,73,18,174,30,56,78,92,44,122,175,203,116,58,242,2,138,100,19,167,173,64,79,191,125,216,155,156,88,68,211,63,246,144,79,130,29,4,0,0,192,79,214,135,15,69,194,229,230,33,161,207,160,116,97,5,6,218,22,65,225,166,128,198,132,203,57,145,33,159,70,98,169,115,168,115,2,255,0,32,172,149,110,28,2,175,22,212,63,234,166,54,105,5,134,89,97,209,42,74,28,90,146,115,184,221,98,234,97,48,199,255,244,3,227,234,154,69,63,149,215,159,1,132,53,47,116,227,109,205,157,225,43,199,6,82,126,93,78,184,19,43,172,71,45,233,255,59,49,225,182,46,118,48,250,51,106,34,123,148,251,207,42,192,20,74,234,181,174,98,112,188,203,202,135,181,123,195,252,165,135,140,73,203,200,115,95,183,200,162,198,242,64,163,23,85,15,49,149,185,203,56,109,112,225,146,82,73,40,136,87,106,215,161,8,142,123,43,184,180,107,144,174,207,188,85,38,132,39,33,163,133,40,29,30,193,199,111,5,21,231,144,222,228,239,238,85,104,158,162,205,120,189,219,94,220,219,41,60,182,17,201,177,163,195,25,70,22,207,86,126,182,239,227,212,140,122,28,9,194,3,222,169,179,95,229,204,241,234,225,254,225,18,0,0,0,9,113,95,97,117,120,95,102,102,116,0,0,0,68,245,128,243,49,17,240,238,27,160,80,220,98,132,33,63,4,226,3,55,178,201,49,204,134,192,62,139,25,43,65,241,95,47,104,232,150,70,205,167,228,122,201,35,75,242,71,178,170,129,50,129,197,159,239,105,210,65,213,7,156,99,128,113,45,109,20,188,192,139,168,112,81,179,152,8,44,64,168,16,10,246,193,163,161,10,175,55,85,54,64,194,204,192,161,215,90,236,80,252,35,133,229,43,95,30,161,59,175,206,165,230,119,98,70,177,255,207,152,185,132,89,246,234,212,78,208,78,71,32,59,200,140,63,173,19,175,92,138,83,220,104,237,155,152,154,146,83,124,101,206,140,153,174,202,74,79,245,145,80,39,168,193,103,198,10,107,29,25,212,251,63,116,202,212,142,233,225,159,31,92,110,52,203,147,32,249,72,144,255,140,183,29,81,194,242,220,204,124,238,195,232,160,79,235,237,232,103,111,229,14,48,88,242,155,206,183,164,123,118,226,17,138,79,43,85,185,212,236,247,17,45,161,138,236,203,117,168,66,173,82,160,69,158,47,79,176,90,114,26,84,5,132,88,2,162,90,214,246,198,179,132,112,220,213,81,39,174,202,193,5,81,152,54,79,92,247,72,22,73,61,73,59,138,101,51,157,226,93,10,139,218,62,199,164,221,63,9,15,37,35,177,212,42,12,207,182,58,112,98,108,202,109,232,215,21,30,104,117,222,56,176,32,188,42,187,167,5,108,59,254,164,227,189,247,3,226,185,209,51,157,117,248,186,77,219,224,6,107,198,100,230,79,207,201,33,71,254,106,251,133,199,192,25,230,216,21,208,111,203,14,178,163,70,89,144,93,162,76,29,59,254,164,191,60,139,108,135,38,18,31,42,214,85,29,228,242,118,28,242,77,246,225,79,191,155,33,120,174,223,40,214,156,250,237,31,29,84,102,34,155,46,135,220,37,228,47,111,177,70,126,23,116,228,116,173,178,70,142,253,225,203,43,169,11,130,106,215,31,80,133,247,140,218,137,37,1,163,71,172,91,10,27,189,190,62,253,172,121,62,152,179,181,119,184,222,228,243,29,172,58,99,172,117,217,221,25,181,30,63,96,25,206,109,81,231,50,163,17,102,30,185,23,140,35,249,179,158,33,170,67,79,38,5,115,78,198,108,74,41,131,228,235,99,157,218,176,240,110,6,36,15,112,189,232,87,167,1,184,136,246,233,24,31,6,218,248,171,75,64,233,58,214,94,121,78,45,42,231,143,208,112,139,13,106,140,51,131,4,188,240,81,167,143,11,249,71,86,13,36,161,105,19,90,99,103,237,228,164,41,206,41,144,253,100,38,176,48,59,88,222,151,255,132,25,139,253,96,82,91,244,3,135,129,253,5,180,205,96,234,2,122,128,15,165,76,252,7,117,136,95,217,44,79,114,47,55,237,107,4,51,53,74,166,16,91,239,226,108,156,29,45,32,151,11,1,216,212,238,9,170,28,72,16,203,222,15,62,115,75,249,103,20,233,69,114,163,86,87,76,129,243,235,53,63,148,227,61,60,102,205,211,10,184,198,148,243,12,112,116,22,136,96,81,1,61,239,74,164,254,239,0,63,50,93,7,235,83,31,51,237,67,18,83,221,12,95,124,46,76,87,178,216,119,123,82,28,101,36,93,212,50,249,161,49,95,107,47,71,140,41,146,237,198,248,42,203,206,34,69,252,108,175,219,19,218,27,225,91,15,140,125,246,141,0,202,204,27,67,141,49,9,251,104,30,182,70,171,55,136,35,251,205,48,15,157,176,162,185,213,89,195,28,24,204,84,12,92,40,254,169,179,221,140,211,46,24,244,211,22,59,175,149,168,207,156,89,216,75,100,39,10,96,32,91,134,22,255,249,119,48,245,27,7,27,95,11,105,208,222,156,72,40,252,231,64,124,241,244,207,168,185,173,129,52,148,100,178,12,192,51,96,183,96,40,159,4,165,226,73,156,188,191,13,13,99,129,129,206,232,92,240,75,71,180,62,22,163,64,214,99,69,249,190,194,88,182,101,106,3,156,93,102,132,52,66,35,92,26,17,28,82,192,78,80,254,76,129,37,223,57,68,136,159,83,221,200,178,145,138,190,170,70,139,174,129,107,3,123,220,99,44,98,67,255,162,2,143,222,154,90,45,76,65,14,38,39,81,206,240,61,54,155,251,60,34,200,254,255,138,55,168,117,213,59,99,4,176,154,253,250,244,53,86,92,67,112,100,20,52,228,87,74,27,64,249,101,136,99,131,239,94,64,134,57,74,73,189,19,89,20,181,240,127,23,15,194,77,236,75,227,235,141,39,108,86,144,80,182,104,247,62,150,111,96,112,75,180,199,184,231,13,223,7,55,13,41,45,217,20,56,88,95,152,133,254,212,140,8,163,217,62,31,167,57,129,120,21,213,119,125,54,214,220,27,69,184,4,8,191,111,23,35,66,44,6,220,192,201,66,85,134,125,16,249,248,219,141,101,22,38,172,97,17,180,106,7,63,161,32,88,234,176,170,119,21,59,201,71,192,203,6,248,245,44,182,200,81,13,77,151,121,83,155,172,253,17,76,140,55,34,187,41,64,56,106,2,15,60,229,0,204,68,208,118,233,135,231,226,109,169,71,243,236,138,119,94,142,241,251,238,199,167,68,12,60,181,88,130,134,6,75,255,62,23,4,183,48,204,174,251,83,190,124,75,23,121,88,145,178,97,55,32,226,108,100,94,223,209,155,77,80,238,238,88,248,196,185,211,217,21,137,190,165,12,155,77,14,35,82,225,154,199,149,233,65,218,174,11,111,150,1,16,67,216,93,41,38,53,241,39,112,202,123,108,129,170,232,1,139,226,90,40,153,148,176,241,148,230,163,41,84,34,169,20,167,209,149,95,61,120,85,205,41,78,1,79,78,182,165,67,242,247,207,45,192,160,174,221,197,117,58,3,246,134,15,91,88,244,183,26,201,68,157,117,243,102,177,152,180,81,60,86,130,214,34,148,93,212,151,216,124,15,73,28,46,83,160,121,188,206,41,204,100,136,93,149,167,238,232,194,126,93,108,192,185,227,149,154,96,198,12,198,3,122,172,60,87,143,85,75,144,76,171,91,165,98,21,241,255,183,13,29,7,141,39,171,211,180,142,7,189,100,46,66,141,143,215,28,135,98,160,194,109,84,69,178,6,46,161,50,95,216,93,181,183,197,169,24,7,186,114,198,48,48,209,177,216,40,134,77,136,110,117,147,136,244,65,36,162,146,242,181,79,17,66,110,243,190,194,199,240,140,64,243,25,160,213,127,191,130,29,44,254,125,93,31,136,129,163,157,198,1,166,146,34,31,209,219,124,29,131,158,191,208,52,27,165,93,167,3,6,137,122,96,211,224,200,123,91,247,138,25,177,239,230,37,108,158,205,19,243,126,58,178,137,107,102,171,15,202,124,62,48,101,209,72,105,249,243,144,20,124,82,5,165,155,201,35,195,234,112,47,119,204,201,98,60,187,218,183,16,220,131,21,242,138,73,7,90,44,94,167,237,223,120,138,119,42,116,39,99,123,75,254,194,110,59,51,74,68,37,81,178,22,15,184,224,84,85,7,236,192,45,143,249,236,208,248,251,105,177,93,98,125,88,215,209,245,34,254,73,255,101,198,96,250,165,3,165,211,30,9,7,157,202,183,26,167,166,11,215,237,118,7,6,40,187,8,180,82,192,232,151,204,208,255,246,246,232,158,221,126,157,18,241,234,76,192,70,120,245,38,168,155,135,45,34,81,219,181,254,245,169,53,13,91,49,89,146,66,212,47,45,5,127,95,39,115,34,187,100,151,131,113,109,123,13,86,32,211,187,27,169,74,252,169,254,128,179,64,149,96,29,48,94,147,1,27,117,235,190,4,123,157,115,73,121,206,109,20,21,169,218,44,98,230,211,199,170,166,223,191,98,19,96,191,115,42,27,68,103,144,177,128,59,20,233,184,58,146,121,236,188,118,0,149,211,22,205,67,47,16,157,76,213,164,1,241,51,140,156,81,231,83,44,172,70,119,46,103,252,1,199,168,137,237,183,210,126,88,182,150,110,160,173,165,52,28,131,64,17,84,202,55,45,70,249,122,144,155,189,211,211,212,244,209,110,230,170,205,245,44,185,97,6,202,26,79,17,14,185,204,4,141,87,37,44,171,86,133,157,153,145,219,248,181,36,39,30,32,214,65,133,206,75,156,2,58,75,95,103,122,5,48,36,240,35,56,32,227,14,120,167,62,10,190,23,75,10,74,244,105,77,88,47,164,4,81,122,113,1,226,115,147,31,154,18,36,190,64,13,159,62,210,117,122,180,193,84,151,253,150,103,114,193,34,197,181,94,141,7,193,94,106,195,79,84,217,46,130,84,16,171,229,203,94,149,37,158,172,206,102,39,23,138,221,172,22,195,92,90,54,114,83,4,77,85,124,233,230,242,206,207,50,233,116,114,61,245,87,182,27,104,225,71,78,209,100,156,220,89,129,117,90,154,12,157,209,49,237,210,52,175,87,117,34,174,221,234,54,190,106,252,228,150,31,238,4,227,188,221,252,156,112,158,214,82,150,64,165,12,152,82,203,22,227,64,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,113,95,97,117,120,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,255,255,63,243,29,26,54,126,34,85,70,71,209,116,213,19,13,186,177,237,214,177,143,134,119,235,65,170,16,160,43,0,0,0,7,115,105,103,109,97,95,49,0,0,0,16,42,138,78,31,22,241,9,27,63,151,72,223,65,50,93,49,40,171,194,239,223,218,171,125,10,0,226,179,6,7,102,41,155,136,1,7,211,5,170,102,131,52,185,14,21,191,60,88,67,42,202,21,70,244,63,41,251,79,73,87,126,191,118,21,236,229,182,148,147,138,148,82,191,204,22,211,79,0,147,87,36,32,196,108,110,188,170,29,179,102,253,179,4,43,33,39,172,50,51,21,171,80,254,181,221,56,210,138,244,34,204,78,237,74,178,11,244,124,6,155,5,170,29,157,248,91,196,45,197,241,88,154,202,242,27,87,55,112,0,102,163,130,55,18,148,101,92,45,19,212,11,152,122,58,162,48,235,218,50,23,81,188,7,159,79,217,146,220,67,20,65,167,200,155,105,76,139,42,171,81,187,158,37,48,142,138,180,182,172,114,194,48,230,59,101,23,145,248,38,152,4,193,60,24,250,23,252,194,129,236,241,6,158,230,163,112,165,95,111,202,159,221,248,32,136,74,185,79,226,220,236,5,98,63,189,28,126,57,169,14,110,179,184,195,178,65,229,60,34,120,92,100,65,81,19,47,208,240,60,96,179,1,161,78,183,87,64,174,243,82,1,123,244,108,5,5,108,136,72,242,46,71,34,57,27,113,193,26,203,145,154,213,66,247,62,176,158,202,3,171,193,100,182,14,23,153,61,40,141,196,132,157,221,239,51,135,163,216,114,40,8,159,189,11,60,62,221,125,19,90,86,16,98,37,104,40,50,145,91,131,112,249,187,124,36,15,129,137,197,216,169,45,184,150,60,151,54,113,48,36,115,51,88,58,74,169,39,152,240,56,49,171,76,190,84,42,227,174,29,156,224,235,144,25,61,87,100,18,143,165,66,14,172,221,206,16,242,70,220,48,26,109,204,46,14,98,38,228,172,46,55,212,185,157,208,16,151,150,124,203,141,192,145,45,116,192,156,138,29,158,49,243,95,162,163,35,159,47,69,85,93,71,155,82,94,35,72,43,5,123,221,107,26,53,181,248,79,150,48,104,15,225,21,254,229,177,75,0,181,182,52,101,26,84,8,122,52,215,145,31,220,126,182,92,255,228,65,212,238,44,109,168,192,146,74,216,111,208,42,243,141,249,117,136,198,224,222,212,151,246,65,24,0,0,0,11,115,105,103,109,97,95,49,95,102,102,116,0,0,0,64,148,184,185,173,190,25,116,111,9,178,51,127,41,110,248,113,70,9,193,74,66,107,240,154,176,180,84,222,89,219,5,46,84,182,34,241,16,102,96,243,71,95,26,137,105,29,43,236,74,47,176,53,245,106,184,164,123,237,153,22,111,24,212,57,255,174,2,248,67,137,166,237,90,208,120,116,243,245,223,136,164,23,21,36,53,118,164,202,238,121,148,125,137,228,77,36,215,192,223,13,62,154,119,179,157,115,211,230,101,65,211,98,80,67,84,160,107,43,216,82,61,176,245,224,46,170,82,36,61,230,134,123,159,177,183,214,102,212,72,190,215,48,37,118,31,142,121,63,225,1,64,56,210,115,246,218,137,181,24,80,137,110,230,180,248,36,36,148,132,117,209,75,8,225,83,206,154,149,194,23,109,238,121,140,3,117,210,103,213,148,164,41,115,175,53,183,33,180,171,176,169,135,44,102,160,164,246,100,222,63,228,166,157,30,230,68,97,108,54,44,133,42,29,2,119,78,143,212,184,142,169,83,208,132,174,93,14,14,229,86,86,169,104,219,42,99,166,66,240,224,78,5,149,72,135,53,161,77,10,45,57,235,205,56,90,225,193,152,250,43,141,244,176,109,115,188,52,227,112,20,120,112,210,100,190,186,203,62,11,183,20,207,125,199,197,165,19,58,6,20,98,121,248,156,137,208,208,61,46,24,143,188,140,131,133,139,168,18,198,13,42,204,200,244,199,208,65,39,249,229,28,8,241,131,234,232,239,106,73,118,114,52,47,238,64,91,162,132,194,17,33,11,159,238,208,98,227,49,119,40,106,60,3,4,121,216,165,119,42,36,174,19,173,10,78,195,187,104,217,236,120,191,133,52,171,118,247,61,42,74,203,43,200,231,26,33,44,109,176,78,247,41,14,252,43,173,248,139,97,89,234,157,169,191,98,74,166,147,215,16,99,112,125,93,226,98,219,227,147,206,13,182,176,155,204,32,62,79,19,131,100,147,159,44,21,102,181,13,121,194,159,40,213,93,36,192,179,213,237,79,108,6,201,15,49,189,40,84,53,228,135,170,182,114,181,156,113,96,186,63,96,65,117,1,155,59,102,224,214,16,247,98,83,25,164,169,31,56,33,229,204,154,199,45,145,197,29,249,245,29,218,35,223,242,16,223,37,168,147,241,237,229,233,124,4,197,249,157,61,164,169,125,224,187,144,7,4,132,62,175,64,246,144,14,117,70,155,109,1,53,171,40,136,221,150,38,144,25,113,73,37,222,202,168,234,118,96,45,124,24,136,76,151,22,213,4,25,31,132,77,107,172,34,134,215,1,42,87,184,122,186,117,91,121,190,24,0,10,116,252,28,20,166,246,220,21,38,51,0,14,190,180,18,5,91,113,101,199,215,141,28,97,92,2,17,239,151,81,243,95,44,4,37,119,153,184,31,197,157,22,203,47,79,249,73,240,180,232,196,167,29,113,108,79,18,24,190,177,223,4,194,220,100,171,131,148,222,27,21,164,95,22,95,60,103,174,61,128,131,85,125,78,49,216,187,114,42,5,173,214,99,22,71,45,58,170,57,253,245,122,108,241,28,36,172,33,7,216,209,230,164,161,134,226,161,163,227,247,177,44,158,105,96,184,77,56,243,48,10,77,252,79,111,188,97,50,233,127,36,165,230,149,39,242,97,49,162,179,112,34,211,41,203,24,125,76,113,236,170,22,200,251,63,158,111,31,1,56,57,30,118,11,48,74,45,80,113,63,140,234,82,111,129,180,94,139,106,222,151,80,54,50,31,212,224,135,248,182,1,64,195,111,115,166,68,49,102,72,159,84,238,79,219,143,125,246,163,139,196,252,201,6,182,15,192,25,6,116,48,61,69,42,123,100,65,60,11,24,45,6,170,17,95,215,60,208,91,146,23,61,123,163,23,248,142,211,42,127,203,185,231,32,241,30,186,78,139,206,223,50,72,74,245,254,241,126,142,51,152,108,156,195,96,210,151,35,173,131,84,181,3,29,91,44,31,2,191,81,177,116,180,83,77,136,160,87,73,170,147,210,130,239,60,80,29,161,228,217,56,162,181,35,51,86,154,13,97,55,189,139,112,130,179,241,222,130,124,42,101,161,168,111,162,198,14,43,79,91,114,85,49,71,89,198,195,35,142,231,3,75,211,39,204,113,82,178,117,71,201,70,215,192,255,242,230,251,135,225,41,156,220,78,145,100,216,121,146,1,246,84,232,86,208,250,58,193,241,122,92,239,213,99,94,235,109,82,8,60,221,254,184,124,228,206,129,103,201,223,110,104,145,58,184,93,242,212,62,224,19,16,213,58,70,97,105,15,249,109,39,194,52,200,69,63,0,234,245,206,30,169,218,99,3,180,49,76,164,9,53,238,93,28,178,191,101,1,35,109,238,33,138,177,223,73,201,121,120,32,87,14,128,82,16,12,136,89,224,26,135,24,251,34,50,133,246,203,41,224,200,69,70,38,188,205,100,56,150,195,219,81,12,51,232,35,251,180,185,239,241,5,203,52,114,26,28,91,12,74,126,249,179,181,98,93,212,119,222,249,43,229,160,242,255,52,102,196,235,231,239,183,205,0,115,13,150,239,181,135,250,233,0,243,112,27,127,10,144,137,33,131,151,70,85,206,37,135,222,61,175,15,230,255,185,81,139,142,66,55,121,24,130,168,195,170,244,75,255,56,5,176,239,73,76,187,120,55,113,11,33,70,216,6,198,240,42,68,189,132,47,36,142,150,23,119,11,253,212,39,206,116,66,65,116,47,197,233,4,181,185,234,160,39,55,221,31,34,103,76,117,132,83,184,66,106,208,28,229,86,49,137,196,213,243,222,57,228,61,144,207,149,238,3,67,140,122,236,201,18,123,64,121,14,219,131,32,28,124,31,48,28,128,94,46,72,175,132,52,228,48,198,16,78,19,40,232,250,210,77,141,149,141,80,179,232,78,164,239,153,32,140,111,135,220,88,54,72,91,169,81,125,182,190,186,222,87,4,113,253,244,95,127,78,28,44,182,145,32,150,52,110,8,47,172,155,238,198,54,115,57,110,109,224,195,192,236,1,48,48,170,199,161,244,225,164,65,60,169,120,156,243,6,31,219,165,139,113,175,24,115,181,11,109,136,73,216,221,186,90,56,61,176,48,180,84,65,197,186,39,63,251,100,241,217,78,81,1,214,220,138,10,100,213,255,18,215,120,228,11,179,245,186,208,25,248,153,193,125,60,227,55,68,205,183,6,146,146,98,170,239,249,85,216,195,95,37,134,135,177,173,124,78,248,14,251,153,23,174,20,183,67,80,62,255,185,42,13,79,165,192,247,206,73,121,109,91,117,84,223,189,210,228,234,244,105,124,171,253,178,164,164,99,136,217,70,120,177,222,116,184,42,10,201,206,138,13,66,161,190,145,222,159,139,224,99,48,173,142,208,121,28,231,4,96,1,145,2,155,132,30,143,241,247,207,49,214,19,5,160,124,127,97,173,100,44,17,172,5,69,79,37,8,11,203,111,167,9,30,36,49,47,166,92,111,195,59,52,12,210,35,154,33,84,136,37,247,225,240,119,172,46,24,61,96,139,98,18,65,235,14,26,31,106,42,7,144,134,36,176,109,164,28,3,228,240,30,159,95,158,105,16,159,17,22,223,19,235,194,201,223,12,255,83,204,135,211,174,235,36,34,107,33,70,70,229,101,251,183,244,67,130,105,28,211,8,108,190,53,171,93,42,163,247,144,31,119,38,231,122,166,29,242,211,218,195,115,87,85,151,33,78,146,3,152,52,20,135,148,144,33,136,221,224,179,198,108,0,193,250,186,106,26,174,172,69,21,179,203,16,200,182,200,191,110,69,216,144,222,95,111,10,197,187,93,201,215,200,177,88,16,58,209,63,20,37,130,247,232,218,89,88,165,163,153,165,161,118,208,12,71,231,30,66,189,84,239,231,56,175,109,94,241,101,74,10,26,246,191,51,168,44,199,165,119,91,48,79,228,166,191,63,119,156,95,55,219,41,55,238,217,187,25,11,71,43,140,130,109,217,100,222,178,130,199,123,35,7,123,234,80,102,245,255,24,221,109,252,119,247,198,128,202,28,248,7,139,96,92,89,158,239,143,131,224,52,118,26,79,148,216,78,247,169,77,140,35,227,242,59,35,60,205,116,188,5,175,65,29,15,157,240,78,132,98,8,169,180,148,205,140,72,170,31,78,36,45,20,50,2,174,17,60,228,84,93,1,71,119,62,78,119,119,26,23,147,255,112,11,98,17,109,76,128,84,20,105,197,206,152,69,49,59,217,189,104,171,229,80,218,196,89,109,234,119,22,170,211,22,177,11,57,160,102,47,178,106,23,238,195,206,129,124,211,35,79,161,217,227,70,2,48,169,0,29,220,208,24,231,158,247,199,165,80,99,123,86,128,192,135,146,50,74,54,134,215,93,15,199,160,144,146,50,36,18,92,55,76,160,242,220,190,35,171,3,239,171,74,185,9,122,222,102,62,149,209,65,32,224,129,158,136,67,187,144,158,241,68,116,67,180,181,230,116,213,29,29,177,129,11,238,90,94,107,106,253,84,238,33,212,102,56,128,93,86,105,147,53,172,69,0,0,0,16,115,105,103,109,97,95,49,95,108,97,103,114,97,110,103,101,0,0,0,16,230,255,255,159,249,14,13,27,63,145,42,163,163,104,186,234,137,6,221,216,118,235,216,71,195,187,245,32,85,8,208,21,179,119,61,61,116,15,34,195,70,230,39,157,139,31,56,121,127,7,5,86,32,110,130,34,32,252,197,166,23,202,133,4,144,91,22,233,35,165,66,128,163,160,79,122,152,64,38,139,249,155,234,222,60,223,198,73,165,161,46,60,158,210,57,44,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,243,73,45,74,12,78,178,19,218,57,121,196,248,86,103,167,33,109,75,175,2,133,234,104,203,254,40,144,106,60,137,37,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,255,112,208,107,171,109,13,147,85,120,162,143,180,162,76,232,79,89,7,231,125,206,186,227,84,3,173,239,147,115,76,74,195,131,82,42,69,160,22,143,99,91,167,111,145,9,7,35,195,134,110,165,65,142,41,151,169,102,200,130,254,31,136,60,114,164,233,246,3,70,129,7,127,64,35,121,248,143,65,197,192,20,24,36,48,172,217,38,174,158,52,134,71,202,142,52,119,16,35,65,144,173,78,8,2,80,43,66,100,185,40,241,75,68,249,142,243,40,239,226,131,55,162,136,176,33,145,53,79,136,194,162,179,219,161,196,219,250,74,86,5,177,47,215,58,169,253,172,76,29,30,78,51,68,157,27,206,210,66,92,156,158,162,205,113,193,233,117,141,47,233,159,238,29,254,159,149,54,219,49,150,77,206,245,128,177,238,19,210,107,13,67,15,182,210,149,27,157,17,116,72,167,249,46,152,121,0,169,152,67,183,83,106,6,182,7,136,65,58,50,123,96,63,59,0,0,0,7,115,105,103,109,97,95,50,0,0,0,16,207,2,225,189,181,162,122,242,123,60,135,240,166,137,191,117,8,13,68,60,209,194,163,236,87,250,123,23,111,188,178,9,166,247,191,207,92,35,224,175,104,246,158,90,178,186,194,187,109,65,53,235,37,93,38,71,16,195,109,212,74,84,104,29,66,30,140,133,63,5,230,232,137,167,7,97,104,125,161,184,158,209,238,51,61,27,193,69,127,97,71,9,36,103,163,29,166,247,62,85,237,198,139,8,242,100,202,249,215,155,87,29,199,236,160,128,28,12,213,175,213,74,16,189,45,60,40,4,38,202,144,124,145,117,90,155,118,62,168,78,94,89,202,252,79,59,95,14,225,100,131,99,180,132,89,142,102,119,101,49,55,235,238,33,6,153,16,250,99,39,68,153,145,234,17,135,200,162,205,210,115,212,35,81,152,138,109,232,43,91,107,13,170,251,64,216,26,124,7,32,150,64,119,107,134,95,49,210,209,45,225,164,128,82,240,74,50,54,215,63,225,24,207,3,196,131,140,84,133,162,161,211,126,236,85,29,209,181,1,65,245,83,72,217,45,165,193,87,131,174,197,25,192,87,172,27,142,208,243,140,53,102,109,211,142,95,51,50,121,7,218,150,33,7,22,97,234,8,61,134,75,251,32,147,200,214,69,17,132,23,49,207,163,35,100,143,169,84,81,5,165,35,102,82,246,2,191,167,116,188,245,223,38,246,103,17,39,64,95,10,84,14,159,255,81,121,184,222,10,5,211,77,201,37,34,48,124,157,37,155,194,142,74,235,190,134,150,220,206,9,76,18,153,23,178,249,53,165,65,200,10,34,92,98,113,80,19,61,65,151,239,177,118,197,220,149,205,145,215,161,176,199,217,27,98,158,81,252,117,57,87,151,13,71,208,204,239,165,224,40,115,18,172,84,220,196,188,235,57,112,41,144,177,132,81,43,130,5,32,15,55,78,18,22,21,205,201,60,225,230,227,220,69,22,151,238,68,44,168,166,118,151,29,175,94,45,112,15,223,155,220,158,176,35,72,47,139,179,96,142,251,13,150,179,154,98,170,145,224,36,36,163,164,119,241,149,167,32,35,22,253,108,130,92,87,241,144,91,132,140,131,134,229,93,147,100,2,40,39,244,62,137,140,98,217,116,82,135,97,164,81,4,0,0,0,11,115,105,103,109,97,95,50,95,102,102,116,0,0,0,64,26,141,19,130,22,57,178,253,45,174,105,33,254,211,78,41,199,199,138,218,176,228,120,119,90,38,236,120,206,157,91,69,135,96,238,116,54,64,43,225,114,53,19,14,138,172,200,56,194,178,154,135,71,119,157,224,169,105,157,144,117,206,119,82,10,198,97,226,62,145,120,157,211,176,173,105,118,45,82,96,143,93,180,169,198,242,47,212,29,226,193,90,39,174,88,11,118,160,218,132,254,165,160,82,238,218,59,14,4,67,138,162,74,154,171,16,185,31,224,208,79,192,211,127,213,234,72,28,201,254,138,98,232,167,23,204,186,56,54,183,33,110,192,134,29,74,1,124,237,37,140,226,113,188,39,213,235,21,103,92,208,31,249,127,10,210,69,180,120,14,113,111,40,52,241,248,252,233,220,187,223,173,107,77,102,22,205,241,161,247,86,63,28,181,24,247,90,221,89,144,189,224,189,249,217,186,21,53,233,1,14,130,60,191,99,123,200,202,244,117,16,141,225,73,163,212,122,54,79,229,166,122,188,238,145,180,135,2,236,159,160,84,28,61,174,204,96,183,73,6,134,6,245,152,159,80,32,92,175,14,164,145,79,144,34,32,157,248,125,251,125,1,190,42,66,169,50,59,206,158,17,93,49,149,240,225,52,8,36,140,201,96,251,53,135,178,210,228,11,98,229,108,35,32,249,206,150,153,170,213,135,105,72,30,0,138,9,126,127,56,200,190,182,113,10,114,137,120,162,75,49,137,134,59,97,7,186,37,143,68,39,203,50,118,176,8,255,147,244,156,138,83,113,51,70,216,139,153,219,142,102,137,159,157,142,142,156,48,239,99,225,54,214,109,18,26,234,56,83,23,75,96,84,89,144,159,155,15,250,81,70,232,126,211,52,220,137,190,152,212,177,31,112,182,51,132,1,77,72,91,21,184,155,207,7,39,116,152,205,74,92,31,232,21,168,133,246,162,77,208,49,105,79,116,160,133,57,208,62,241,125,125,202,185,231,1,31,41,242,213,145,153,63,44,75,189,13,207,12,216,141,29,197,225,92,195,180,156,247,182,229,139,6,3,165,204,2,7,15,58,116,255,60,51,107,64,17,169,197,119,144,216,123,247,24,172,104,172,156,116,190,98,158,21,14,119,117,203,47,97,63,73,186,251,50,12,110,18,130,7,67,81,116,58,108,255,159,188,205,246,45,236,33,19,135,203,219,47,184,119,55,65,93,54,7,157,140,52,48,248,20,251,246,132,25,94,135,213,40,97,220,213,83,229,152,201,192,157,10,86,209,215,242,205,28,26,208,210,5,144,11,99,117,94,201,106,82,32,246,217,164,147,94,251,21,237,243,233,0,77,154,157,242,87,201,159,138,65,141,103,142,202,142,214,205,50,56,3,125,103,84,19,171,222,38,239,131,194,187,179,109,36,107,243,22,43,202,77,140,7,102,141,174,189,7,235,203,185,248,74,98,65,189,200,151,244,143,25,238,164,233,97,229,7,252,235,220,125,161,242,75,6,215,221,32,212,124,243,247,45,68,107,164,138,187,63,225,46,179,133,22,18,60,33,63,171,61,29,30,156,57,151,111,66,184,134,232,210,247,205,75,114,113,176,66,142,192,123,57,139,65,113,116,82,44,72,195,158,158,103,238,33,247,118,115,68,204,78,163,8,16,183,203,209,19,254,197,38,175,45,222,151,15,189,234,190,129,145,97,241,28,62,222,0,118,206,242,92,34,238,115,253,42,147,186,124,105,1,159,162,141,250,24,122,144,147,187,80,216,243,148,25,87,186,223,94,21,122,68,44,225,203,5,154,158,154,138,28,208,98,209,224,249,202,237,38,175,219,99,52,210,83,150,10,109,220,182,100,31,153,47,83,45,184,173,40,249,101,177,239,16,114,253,232,201,194,89,107,130,47,252,178,19,82,155,94,192,248,12,223,192,1,130,26,254,91,132,174,227,64,104,245,102,3,82,217,147,13,4,7,243,229,121,239,89,94,91,246,43,119,92,172,237,83,112,30,49,246,174,205,242,91,69,65,66,110,122,116,192,198,57,26,67,63,155,53,80,126,139,214,124,217,226,1,132,141,108,61,36,142,6,70,220,155,97,77,219,61,66,71,40,53,2,117,58,159,67,245,197,143,212,192,39,243,96,153,87,171,103,51,213,139,253,46,126,242,30,110,236,53,21,227,45,155,116,213,166,183,165,169,11,243,52,185,205,55,146,86,120,134,111,9,111,239,75,70,110,22,244,163,117,107,220,43,174,164,134,174,61,140,140,187,252,212,211,76,95,64,68,81,46,32,181,51,56,248,54,137,161,191,133,167,110,36,204,255,153,173,177,188,213,113,242,48,159,150,205,240,64,13,163,139,255,148,143,95,39,44,55,148,233,103,56,74,155,200,183,153,238,55,121,166,51,200,145,72,25,162,108,119,16,105,120,70,19,14,133,53,152,238,219,110,100,241,203,57,41,191,151,209,74,166,87,63,116,5,94,67,166,168,227,7,196,112,38,34,189,196,254,59,50,41,239,191,171,75,138,144,163,175,56,162,227,10,1,114,247,139,116,237,156,172,173,54,249,127,30,102,184,115,68,69,225,11,39,166,82,235,217,174,94,221,21,245,166,254,254,237,173,41,248,238,145,100,242,111,242,28,143,13,250,205,18,14,210,46,193,7,6,196,230,197,51,147,93,114,80,58,102,45,244,143,219,202,165,159,191,151,152,60,121,24,143,202,144,25,162,145,181,177,1,144,153,22,232,146,54,101,101,92,247,163,61,64,150,2,46,2,117,244,80,70,82,180,198,253,211,8,35,92,195,24,217,143,54,84,72,202,146,202,4,237,153,34,123,200,129,75,52,177,142,230,175,174,233,152,183,146,116,60,68,250,197,67,138,67,73,7,53,10,162,123,184,156,210,1,98,10,86,173,220,30,94,95,92,85,117,163,61,171,246,81,176,205,222,72,241,220,55,44,219,123,189,231,75,79,176,85,216,227,211,177,79,66,72,43,81,205,231,110,10,160,176,9,86,248,24,145,108,74,77,94,93,225,204,163,160,109,77,58,18,5,35,184,236,119,23,120,117,90,166,234,194,145,44,24,217,174,7,223,20,194,57,113,53,109,236,153,121,107,59,100,44,254,154,15,21,195,181,167,238,216,220,137,137,205,81,14,208,153,255,47,138,240,63,134,53,213,37,52,61,186,80,51,12,150,119,196,157,72,144,134,11,31,90,1,10,194,78,34,162,148,188,193,50,174,183,89,32,193,112,169,214,8,86,188,37,254,222,210,43,216,190,96,3,148,90,168,31,145,98,94,60,109,233,141,211,37,2,155,24,237,249,24,40,150,153,184,151,91,61,117,132,251,85,234,118,212,52,170,67,78,89,74,218,48,176,14,15,191,35,18,164,189,167,232,102,12,232,108,192,170,6,68,96,242,137,4,164,23,244,109,209,146,186,7,2,187,207,198,2,147,71,39,102,102,234,112,219,116,184,227,163,14,38,143,133,40,41,22,106,33,67,189,142,158,26,0,161,228,105,214,162,7,71,68,234,2,234,201,248,149,228,232,90,130,164,238,180,158,213,40,107,76,48,224,238,139,146,86,144,26,36,9,22,4,169,177,119,254,143,6,91,98,223,132,33,28,99,153,113,33,52,204,81,12,251,176,88,143,22,7,23,24,135,202,35,144,141,142,206,251,33,233,23,75,98,111,167,166,19,27,105,27,135,205,112,222,13,60,65,13,126,36,142,197,199,248,61,95,24,112,235,11,136,251,87,0,230,95,122,206,216,105,192,243,1,108,231,1,0,72,25,94,92,53,141,208,157,86,30,15,8,222,125,24,150,64,2,26,57,141,90,236,128,237,250,180,22,167,113,207,141,48,137,218,133,63,94,113,66,11,119,96,246,249,57,134,65,133,4,139,137,22,148,235,3,187,15,159,10,189,136,71,246,180,186,95,126,33,110,238,21,41,47,118,122,197,204,14,171,182,230,39,86,71,19,244,177,90,229,144,33,66,46,179,253,140,150,38,23,14,56,39,2,222,23,13,73,174,180,245,204,114,126,41,95,245,75,26,167,139,82,154,43,54,239,110,41,246,68,216,117,44,99,203,192,29,74,238,150,90,60,190,183,213,184,17,5,214,249,216,153,130,53,126,104,211,242,7,253,203,40,72,167,60,69,112,5,95,115,69,135,46,249,154,172,60,78,147,32,133,194,251,95,32,44,66,15,4,231,99,165,147,17,66,245,21,82,244,23,31,127,72,72,188,119,107,82,100,242,141,208,111,95,32,128,54,116,184,17,47,75,157,11,49,240,163,30,45,1,248,100,69,185,30,2,107,222,222,217,248,76,86,229,89,3,130,65,242,36,167,152,101,197,171,242,218,108,46,177,36,82,117,123,99,187,62,251,97,23,31,55,147,150,95,37,198,3,30,182,97,227,192,125,115,153,30,174,255,5,6,247,64,145,157,179,235,29,145,105,24,192,125,77,206,9,49,5,25,254,253,255,65,224,25,10,188,248,90,234,253,149,133,112,12,89,35,22,182,154,184,168,58,182,184,54,253,62,78,224,102,193,30,184,119,8,196,216,84,168,121,106,130,31,96,69,34,0,0,0,16,115,105,103,109,97,95,50,95,108,97,103,114,97,110,103,101,0,0,0,16,225,255,255,239,21,67,163,199,104,94,139,66,57,223,182,33,184,76,86,81,230,142,71,174,242,154,253,186,22,128,218,35,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,139,239,220,158,151,61,117,127,32,145,71,177,44,23,63,95,110,108,9,116,121,98,177,141,207,8,193,57,53,123,55,43,61,157,45,9,170,165,85,169,236,51,14,199,161,1,119,114,196,208,177,48,72,242,150,184,12,20,142,244,0,91,87,17,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,7,0,0,144,11,183,45,219,248,19,18,84,251,89,107,25,140,106,137,138,253,231,49,10,36,97,91,40,36,37,190,82,33,0,0,240,17,168,32,192,185,130,231,176,87,241,176,46,2,100,172,177,134,252,88,194,96,165,101,7,207,28,238,60,244,52,18,139,77,109,21,4,179,69,26,122,139,211,19,112,3,84,155,248,119,32,116,104,132,175,5,134,191,28,192,32,202,146,156,35,118,85,7,120,27,150,165,205,108,166,31,230,253,231,161,179,183,106,62,90,127,224,241,39,186,23,179,60,53,54,144,34,48,146,28,210,164,15,17,253,111,70,68,17,242,173,241,44,96,0,175,40,150,248,14,57,39,107,212,20,78,82,175,149,237,151,31,214,51,93,57,234,138,21,200,236,169,155,87,67,49,112,26,213,194,244,50,69,52,32,224,25,130,169,204,189,78,168,55,116,47,241,241,103,142,74,27,202,223,50,104,211,20,31,196,11,137,179,83,159,252,91,199,25,6,25,45,100,193,5,69,182,91,74,53,69,246,35,191,46,189,254,63,240,167,225,37,123,138,182,127,28,105,68,233,44,70,142,29,61,166,69,238,240,147,17,65,138,142,214,254,131,41,152,13,27,131,195,252,140,215,38,43,149,41,90,71,54,0,0,0,7,115,105,103,109,97,95,51,0,0,0,16,66,229,26,140,193,165,55,119,15,12,248,174,63,135,26,175,80,19,58,243,40,169,191,223,164,134,73,168,176,59,157,2,41,171,35,235,69,101,127,197,69,244,81,73,63,185,245,150,95,138,250,14,115,109,193,123,161,161,227,167,40,98,248,26,25,223,69,20,172,77,143,172,36,24,106,8,195,118,199,159,2,31,80,156,155,199,128,196,124,218,219,128,13,43,164,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,52,102,152,102,110,80,39,205,200,21,113,241,44,110,114,162,202,98,215,184,74,145,200,227,222,107,157,167,234,124,100,25,60,233,187,48,141,189,81,177,166,163,210,90,38,51,8,107,89,76,51,209,155,219,235,64,50,133,147,255,14,19,23,3,186,250,43,233,140,91,221,35,87,237,145,194,251,236,164,166,248,4,77,115,38,194,33,130,12,81,36,69,167,36,53,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,230,217,194,233,70,125,59,175,108,61,203,137,75,243,39,202,7,209,220,145,103,152,150,30,115,160,178,188,216,1,153,28,129,199,23,66,244,67,106,216,29,124,11,245,201,162,243,159,134,255,60,77,156,187,74,106,106,78,194,120,111,237,11,3,193,97,220,85,115,122,193,180,129,127,69,178,66,223,93,55,95,173,155,225,64,130,201,173,190,62,139,220,78,52,238,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,136,22,65,247,231,78,29,193,184,81,69,154,109,191,91,238,108,194,245,64,231,220,177,39,113,183,84,219,104,134,176,14,248,163,8,194,146,251,193,172,170,248,46,60,48,151,41,7,97,109,103,159,23,185,94,94,55,69,47,247,22,50,146,49,139,136,250,168,176,250,191,145,184,27,113,43,178,205,192,240,44,46,103,20,94,21,180,42,205,43,27,25,120,38,26,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,11,115,105,103,109,97,95,51,95,102,102,116,0,0,0,64,191,253,180,148,17,83,17,218,184,24,171,24,59,180,212,99,81,211,86,128,62,212,212,32,94,228,8,19,60,97,136,33,96,43,188,198,181,253,213,136,98,98,195,1,56,235,243,226,77,62,219,48,103,219,108,76,187,182,65,124,62,28,29,88,112,241,239,105,239,73,221,94,253,41,211,235,143,44,174,93,121,95,132,35,156,17,187,244,141,72,0,112,37,46,181,94,54,136,168,51,99,243,72,0,217,218,230,181,251,143,64,44,217,115,29,22,196,120,71,153,174,96,247,16,246,130,221,45,57,171,32,4,199,135,199,161,103,106,205,159,96,6,58,177,79,110,250,213,58,227,246,182,68,96,27,89,49,117,104,86,234,188,195,80,96,68,94,181,59,174,247,254,101,3,25,47,88,18,135,241,4,226,11,205,30,148,221,125,169,89,178,65,140,72,242,253,59,202,230,184,228,91,61,239,17,207,104,171,91,166,199,245,0,238,12,56,78,36,129,220,92,63,208,40,47,241,44,8,60,180,112,101,94,80,169,211,139,127,70,55,125,254,105,117,146,76,73,13,132,30,133,230,202,219,228,90,77,145,33,151,131,228,44,139,68,183,187,68,133,227,31,223,239,47,46,94,114,96,231,21,59,68,177,152,164,241,78,24,130,84,224,48,2,58,108,134,23,207,74,62,222,254,213,175,255,108,120,128,112,30,137,101,184,88,148,4,28,118,75,43,173,243,208,61,170,11,6,134,146,69,205,59,58,247,117,172,223,177,43,207,166,119,89,35,173,174,235,3,56,125,83,80,87,184,74,177,156,240,241,55,143,116,95,251,197,235,183,144,246,61,169,65,159,179,90,160,148,92,67,130,107,95,132,7,102,229,15,235,163,112,221,156,166,125,235,58,160,221,240,7,91,166,25,187,4,74,252,91,206,165,72,159,46,95,174,38,87,198,46,81,210,101,217,93,84,225,70,200,190,169,137,114,206,39,81,215,133,45,15,153,52,56,126,82,161,220,65,69,25,239,32,195,130,164,18,244,31,140,20,165,113,53,42,178,241,154,37,54,93,240,200,214,105,192,65,29,174,109,180,38,26,14,174,255,101,97,109,234,5,76,120,51,46,156,45,79,81,50,143,121,91,89,109,22,123,62,244,63,62,115,253,61,147,199,150,169,148,125,108,172,254,251,196,238,200,241,12,253,81,201,46,78,4,59,154,233,185,128,6,246,219,238,98,43,251,160,252,238,20,120,157,146,157,232,1,47,173,218,148,220,123,121,135,84,114,69,43,98,144,31,146,113,51,104,160,78,210,192,84,148,137,240,204,252,238,77,240,200,231,226,164,243,92,109,82,42,47,66,12,49,84,174,127,121,137,123,237,81,198,252,220,147,247,165,67,132,146,180,239,78,249,145,219,244,200,13,220,85,43,126,81,216,88,79,156,211,22,129,243,38,59,133,118,210,150,28,215,248,5,118,190,66,176,18,6,108,198,3,13,248,223,66,178,19,240,128,198,78,21,221,31,3,87,10,49,21,58,58,222,249,250,108,210,215,48,131,221,60,237,160,161,193,128,155,144,175,2,61,211,83,242,157,66,67,40,13,175,100,25,51,176,249,224,183,209,154,120,123,253,185,180,20,43,46,17,141,180,81,223,120,32,180,95,173,221,32,230,141,13,154,103,222,218,12,55,69,156,176,67,81,60,65,250,194,53,78,11,254,192,248,23,46,205,122,120,39,116,41,17,155,208,247,250,171,184,244,47,10,87,54,16,182,111,134,110,198,200,225,27,82,64,255,72,123,122,251,209,101,196,63,225,77,215,136,21,221,94,186,158,116,67,225,84,37,112,21,83,105,160,249,7,140,85,12,80,248,108,252,151,49,199,5,40,237,21,179,215,127,159,119,227,167,149,205,160,33,43,176,193,230,124,248,175,129,203,11,149,129,204,18,37,208,119,21,28,248,254,209,35,53,147,68,172,35,244,26,116,235,7,225,117,248,118,131,148,155,25,171,96,68,17,108,228,173,26,11,171,99,69,229,167,215,195,69,248,93,71,243,197,161,226,157,219,3,151,240,241,52,36,135,158,145,121,24,234,185,121,84,180,59,126,198,27,179,30,198,233,255,182,17,47,218,197,37,30,148,58,35,154,94,185,226,28,189,242,173,104,120,89,35,231,94,95,64,32,26,220,213,167,177,209,64,11,72,76,59,1,254,99,37,12,116,70,193,26,100,24,187,231,11,54,31,82,231,134,188,4,238,25,192,49,110,208,36,191,178,89,192,117,231,57,181,176,133,5,143,99,155,143,228,208,144,187,52,221,155,187,46,84,223,141,242,230,226,207,44,210,165,0,100,20,91,81,53,94,150,224,241,99,20,238,175,92,218,62,66,92,52,200,14,252,200,110,75,26,48,33,14,195,187,166,39,193,255,107,236,38,185,5,255,198,120,23,56,0,127,59,3,78,136,22,114,237,213,87,100,122,88,207,117,69,156,6,110,225,61,128,85,53,129,249,236,203,69,179,85,167,229,163,39,22,214,25,144,43,42,179,239,210,27,130,61,202,26,222,242,165,193,59,30,195,164,143,62,88,171,143,143,161,87,209,40,125,38,90,187,31,183,7,126,166,243,186,138,29,56,36,57,194,144,10,148,228,75,24,104,24,25,229,110,171,96,228,81,12,239,254,114,22,121,172,106,156,152,42,119,7,35,11,184,234,200,8,171,126,176,36,188,159,88,48,120,234,228,6,25,182,203,128,36,253,98,8,142,153,5,30,141,240,135,45,236,128,82,173,134,124,22,167,197,220,212,169,104,53,12,162,25,175,155,173,73,16,165,2,19,133,38,22,172,37,33,240,72,232,92,141,195,162,12,173,238,90,133,241,71,79,119,17,51,81,32,213,118,166,19,71,140,252,131,45,84,157,125,138,58,0,29,168,95,63,25,223,22,243,102,55,18,92,131,207,80,118,162,120,133,185,145,158,220,142,102,235,140,121,73,94,224,229,239,148,221,246,59,105,56,114,144,229,113,141,143,93,58,105,200,199,92,25,38,14,112,22,137,157,20,27,83,202,158,147,151,118,27,143,172,248,195,155,122,228,170,231,231,186,77,131,132,180,2,129,237,30,146,155,10,254,55,246,106,9,161,102,20,189,175,249,40,15,146,202,3,139,76,102,181,218,72,212,214,147,99,202,233,210,214,252,184,255,127,159,98,77,250,246,186,239,117,112,151,0,190,22,225,241,134,60,85,195,18,177,62,28,140,203,30,115,53,229,166,213,248,35,29,99,71,151,147,123,23,144,238,120,58,30,204,241,13,177,135,65,45,209,35,48,183,47,8,203,246,253,185,40,82,106,22,141,138,73,176,217,151,37,5,96,96,5,101,9,107,55,108,147,12,38,249,131,200,46,192,122,31,15,69,238,234,171,37,81,89,18,220,253,240,234,77,206,63,189,56,129,185,196,208,9,46,39,36,33,143,153,19,213,75,237,184,162,171,107,149,48,205,64,252,244,233,229,104,111,239,195,42,199,121,175,105,143,6,83,255,194,118,199,5,38,201,250,72,148,81,46,169,129,224,237,91,207,39,136,33,15,184,75,208,74,160,221,140,14,96,164,235,222,137,49,157,217,89,62,218,3,186,55,102,166,91,1,149,13,130,82,214,185,99,180,170,204,217,76,220,112,4,218,185,140,172,195,139,66,134,88,20,11,123,102,230,32,47,83,82,110,174,208,126,94,253,209,176,121,160,102,190,63,83,29,229,94,140,239,12,136,96,197,61,254,24,189,76,145,67,163,176,250,220,140,84,144,206,206,69,212,211,6,187,185,0,107,96,109,205,247,98,59,15,145,169,52,38,133,145,40,97,181,198,166,153,166,112,51,124,177,186,26,47,31,90,66,26,160,88,50,50,255,38,3,20,13,114,126,39,202,11,122,213,250,178,225,88,142,25,113,118,82,161,69,227,47,211,50,47,66,232,80,6,122,54,102,96,192,97,127,144,158,234,243,142,94,35,195,230,123,254,84,43,173,131,147,68,168,175,118,47,97,51,16,129,242,179,111,170,64,252,81,188,1,240,31,206,224,134,192,63,28,42,140,23,227,219,144,221,70,170,93,62,119,26,125,108,24,113,250,42,45,90,246,170,66,139,19,62,86,102,243,171,185,122,219,92,112,35,78,31,143,26,196,20,62,236,53,137,98,186,13,248,172,75,13,23,39,56,202,59,229,22,4,163,202,151,79,161,65,131,228,18,29,23,17,85,100,155,3,60,76,141,1,106,27,140,68,75,133,203,93,185,43,149,183,146,184,22,83,178,72,238,213,15,152,148,166,96,213,242,116,12,1,20,182,123,54,80,184,247,137,191,27,234,65,99,219,26,38,129,153,62,92,45,71,245,198,15,68,24,98,157,146,144,125,196,157,182,252,27,48,92,135,248,160,100,108,232,151,164,234,119,248,168,189,162,232,183,183,172,193,87,163,172,138,156,117,98,220,148,216,248,69,7,179,255,55,51,135,25,71,166,218,100,45,71,45,122,217,199,94,155,0,5,82,125,142,132,184,71,187,142,96,190,11,48,122,118,101,172,171,13,199,125,218,193,83,62,111,101,131,108,198,49,114,27,0,0,0,16,115,105,103,109,97,95,51,95,108,97,103,114,97,110,103,101,0,0,0,16,219,255,255,79,158,129,87,48,1,187,50,104,134,109,127,48,137,58,78,72,159,236,101,92,248,217,211,115,101,169,128,1,63,124,173,181,226,74,173,248,190,133,203,131,255,198,96,45,247,41,148,93,43,253,118,217,169,217,154,63,231,124,64,36,204,201,111,205,99,99,197,113,236,96,168,124,216,161,239,22,107,170,143,84,86,69,161,143,147,167,34,168,75,227,143,27,234,128,156,191,131,194,134,234,16,193,212,125,120,82,212,220,163,49,98,15,99,120,142,178,138,170,28,94,162,235,58,19,199,140,10,184,173,237,232,228,123,84,156,254,133,48,130,169,213,228,57,35,11,15,248,141,178,124,29,77,195,135,42,12,102,97,93,18,182,41,218,17,149,177,137,83,162,178,105,176,36,122,39,209,214,61,210,122,210,142,116,174,19,49,187,29,188,113,226,162,129,165,213,150,142,207,49,105,2,250,104,204,144,24,245,231,233,199,163,227,123,25,56,45,188,66,129,42,160,5,61,87,114,86,118,54,32,98,177,254,98,215,207,202,25,66,137,67,130,70,216,68,191,214,38,139,171,30,203,20,38,0,0,160,245,115,138,19,144,181,134,17,194,122,180,247,211,29,51,57,23,89,234,91,49,198,93,109,13,165,227,46,242,165,226,6,101,229,64,83,119,77,3,144,247,141,44,48,246,84,33,94,63,169,222,147,175,18,129,148,224,65,168,58,139,22,239,109,147,10,90,127,92,16,218,73,109,223,190,184,6,190,13,86,140,109,199,128,213,6,87,232,210,154,114,24,166,218,121,41,160,226,187,149,146,223,122,252,31,238,81,174,85,106,136,207,217,102,56,151,26,247,17,222,251,230,254,24,196,98,210,230,233,79,140,154,164,60,171,178,166,230,188,181,152,135,207,80,110,83,185,255,28,140,163,236,113,243,12,31,208,49,143,112,110,142,247,244,121,123,131,68,75,19,23,121,189,131,228,254,170,246,145,161,146,87,191,217,87,224,165,69,161,183,207,65,159,209,76,232,87,9,101,107,156,89,137,166,245,220,153,160,135,233,163,184,225,199,60,79,200,97,146,63,84,68,240,226,45,237,29,33,75,72,129,63,222,103,203,4,101,131,67,237,54,132,98,220,53,200,51,230,49,108,34,65,0,0,0,7,115,105,103,109,97,95,52,0,0,0,16,181,39,240,95,21,56,61,69,99,238,239,38,185,165,36,151,218,130,113,126,54,89,43,10,163,14,75,168,227,174,236,15,220,158,20,65,138,19,204,144,233,5,219,91,135,172,158,139,78,115,79,51,2,74,28,119,109,192,129,46,223,103,6,31,41,51,223,168,170,78,177,139,158,203,147,150,123,201,43,151,186,24,134,149,46,130,120,190,104,101,55,249,211,145,130,9,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,2,110,123,180,112,213,182,160,84,27,197,140,158,234,190,77,80,38,237,6,220,214,203,189,205,93,213,160,93,112,106,29,20,250,147,54,153,97,201,142,254,37,65,46,173,166,70,0,79,95,188,150,71,129,216,251,191,161,165,65,172,192,134,45,22,48,157,67,219,162,231,236,184,46,215,253,120,74,162,210,82,8,216,111,103,212,250,34,133,218,54,97,25,41,194,49,1,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,2,188,38,183,111,117,33,158,248,149,111,65,250,34,171,52,249,47,42,194,55,184,200,143,193,122,103,170,96,106,143,238,10,231,241,133,164,163,202,79,0,220,150,230,178,155,72,91,119,86,84,120,253,118,133,176,54,180,140,63,78,227,12,104,35,157,184,204,54,232,199,94,219,184,9,85,48,225,199,198,145,5,232,202,111,28,133,230,105,228,228,142,37,72,26,102,17,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,2,160,94,32,100,39,186,161,144,97,134,151,56,169,113,128,22,178,19,197,55,69,155,175,207,15,95,81,194,157,232,220,35,212,79,213,175,229,203,16,2,146,236,158,184,144,74,182,159,77,236,89,179,108,50,101,173,198,115,61,240,5,147,162,48,250,194,58,239,17,13,158,74,54,129,177,17,163,247,222,39,71,45,202,193,255,12,218,137,76,245,153,207,165,35,252,44,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,2,0,0,0,11,115,105,103,109,97,95,52,95,102,102,116,0,0,0,64,58,95,86,149,157,135,226,187,87,128,241,147,65,190,235,8,184,188,236,164,60,225,87,16,85,170,44,53,36,254,214,23,64,161,158,54,39,121,97,208,165,206,80,176,197,30,80,51,123,145,29,222,4,182,104,191,125,86,119,134,92,244,88,17,117,169,219,98,53,166,13,195,16,165,125,200,81,220,212,148,89,93,183,231,131,143,173,205,195,244,139,222,61,23,220,79,103,236,4,11,25,128,151,75,219,27,5,97,126,237,70,206,209,11,74,30,236,135,174,130,88,167,200,16,29,75,191,31,186,26,103,217,81,87,191,159,183,108,74,6,17,154,196,158,41,202,90,59,127,195,95,218,117,128,144,128,41,14,116,4,213,255,92,100,123,66,106,22,226,212,200,235,34,82,97,132,134,244,38,109,70,235,78,35,150,147,182,56,66,238,46,25,127,21,201,216,153,116,156,146,18,107,78,101,130,194,236,35,18,25,163,195,50,93,62,159,168,178,204,11,212,13,164,87,112,186,96,211,32,74,217,228,71,52,62,122,146,143,203,143,77,254,167,10,45,110,24,254,39,131,14,90,255,115,151,85,195,127,220,48,126,61,31,157,87,213,30,82,153,203,183,147,48,213,100,51,178,11,139,254,111,192,92,90,116,103,6,85,47,241,153,179,115,58,197,226,49,24,199,145,109,118,145,136,184,171,235,180,33,136,21,245,238,106,168,53,60,101,179,42,117,35,244,205,17,180,184,54,201,186,218,172,221,137,200,216,49,131,165,90,74,71,158,165,120,58,18,75,106,61,100,87,50,40,186,160,120,216,215,174,63,22,84,176,204,188,241,198,225,73,168,153,183,187,247,45,70,69,166,230,77,96,97,50,141,231,127,216,166,34,151,206,171,34,112,121,150,139,116,143,156,214,60,127,59,255,237,129,15,97,138,227,192,66,169,75,88,189,165,44,97,221,242,107,115,83,243,245,53,158,191,250,248,113,64,213,56,226,153,15,64,151,108,45,242,94,244,87,193,200,19,71,248,232,0,205,125,72,9,7,192,135,192,253,219,217,75,175,61,18,109,85,228,45,27,28,85,94,231,45,27,213,107,172,183,135,105,252,65,164,171,168,157,222,200,216,107,109,47,90,211,30,101,13,119,85,172,72,68,4,135,44,228,70,236,1,255,183,116,37,9,47,10,226,191,28,251,184,245,88,40,29,79,220,68,195,158,9,240,31,83,142,193,46,143,34,196,53,134,21,133,92,191,167,129,48,229,170,133,102,113,19,7,253,146,137,126,195,104,222,232,166,69,47,62,7,229,232,217,250,237,143,83,38,20,130,70,121,77,215,142,78,31,152,197,41,224,244,61,158,46,116,1,226,169,208,48,3,174,115,103,166,27,39,37,172,115,60,91,184,221,179,157,227,98,42,67,123,27,83,251,146,30,96,61,96,101,36,45,80,134,63,19,109,253,176,105,186,100,227,178,205,28,26,249,54,122,195,227,108,130,250,185,228,143,205,55,4,229,82,209,19,146,216,96,204,190,26,84,112,32,115,206,225,24,53,239,91,37,119,92,234,86,175,55,196,179,163,185,135,182,137,223,81,174,231,157,167,236,4,196,183,225,149,52,199,221,206,114,143,48,204,146,8,18,114,179,98,176,37,192,79,134,89,118,68,219,203,187,28,135,39,109,23,81,78,165,216,152,7,92,130,78,83,137,19,51,136,152,17,187,58,251,90,221,49,44,40,98,57,182,158,222,187,5,4,13,183,108,202,217,95,142,156,20,32,235,134,143,252,144,66,224,83,249,29,127,156,140,26,19,88,229,97,153,101,143,142,50,174,186,142,146,7,107,75,207,199,175,176,137,100,173,71,201,46,45,125,162,49,112,19,149,248,94,225,26,198,72,194,243,223,24,191,71,113,146,35,218,109,110,67,176,119,108,165,9,157,57,161,128,3,194,85,109,22,153,230,70,169,43,17,62,44,130,226,16,220,123,50,246,184,11,185,180,162,211,14,97,206,124,82,18,197,22,42,68,204,27,142,197,196,245,147,155,156,233,191,189,31,243,49,198,150,249,4,14,135,28,80,74,246,120,45,168,249,247,47,90,97,121,29,4,159,255,121,240,152,242,194,220,23,74,16,169,60,49,147,253,156,127,134,198,117,9,43,98,240,187,86,41,155,138,84,238,50,204,79,111,15,192,28,249,75,126,118,52,30,193,221,88,226,85,185,131,149,103,185,3,42,197,24,209,194,179,246,246,94,184,143,52,28,103,117,88,112,171,129,43,52,1,84,205,28,99,36,155,66,75,104,12,21,116,64,114,210,219,129,186,65,208,26,184,230,250,225,0,43,77,22,35,254,140,133,123,228,84,200,65,73,38,151,244,161,186,20,194,252,247,45,108,86,23,168,24,237,50,97,112,106,56,42,48,235,139,43,163,37,131,160,239,222,237,154,70,235,19,9,169,70,48,235,109,173,147,235,52,162,53,36,180,74,210,65,200,127,60,148,79,217,105,137,107,65,146,23,234,88,45,67,249,42,147,199,175,190,74,71,216,39,125,71,93,201,42,165,167,27,36,82,207,34,26,231,189,84,106,230,171,41,255,82,70,249,64,115,177,171,21,101,109,207,15,241,92,111,143,208,114,184,194,63,106,8,238,228,113,38,143,131,243,153,173,44,145,90,206,94,176,237,35,4,89,110,31,248,171,221,165,95,186,68,77,126,156,14,246,9,174,149,162,104,254,183,139,86,21,137,178,54,212,211,249,122,201,106,238,112,250,131,23,159,103,142,103,228,202,74,76,18,0,130,54,179,93,31,133,37,236,128,231,215,179,120,32,101,12,64,170,148,182,2,27,146,164,185,183,22,140,216,248,98,3,26,74,129,136,203,67,35,91,118,98,92,230,96,234,161,41,181,240,239,224,215,244,102,108,99,176,94,129,47,120,143,241,198,7,214,92,190,157,17,203,21,24,171,57,174,9,67,5,67,202,34,116,17,8,172,139,224,53,161,226,74,84,25,38,50,223,121,176,145,124,10,1,224,218,187,183,56,238,147,0,80,5,3,118,229,206,214,51,77,57,128,109,199,163,232,84,122,21,67,82,6,175,9,130,193,220,158,125,223,173,197,169,173,197,248,245,205,132,105,86,164,61,57,154,80,116,121,16,90,34,171,57,158,218,81,121,59,160,41,228,111,93,186,185,235,190,102,109,98,15,19,83,177,214,221,239,119,202,130,28,29,205,87,250,29,246,37,8,231,24,234,90,219,168,255,27,127,175,164,155,220,174,145,10,55,58,222,20,206,124,46,16,163,247,148,136,15,20,81,237,122,122,214,85,31,239,209,98,18,98,136,17,155,104,192,220,38,170,85,45,79,36,157,15,224,3,250,231,15,191,0,177,198,229,102,132,238,76,16,195,199,2,125,128,65,234,7,168,218,170,201,174,101,227,113,150,139,235,108,218,197,159,12,2,145,187,3,190,63,13,49,96,112,91,214,116,154,30,112,144,237,44,54,43,91,141,167,168,212,85,8,30,241,16,4,193,40,202,240,19,242,83,12,155,206,130,115,211,72,180,114,110,230,81,241,239,159,29,9,44,147,136,34,65,226,102,10,15,50,221,171,220,68,71,152,188,42,43,153,12,163,228,61,102,234,188,179,23,187,245,194,207,53,149,196,147,191,177,92,126,115,33,171,127,215,133,72,62,164,187,239,156,33,138,27,55,139,44,112,238,189,182,151,222,135,31,143,143,199,99,84,192,171,94,133,248,118,183,249,226,130,81,217,244,16,173,27,78,238,58,95,96,178,124,103,66,206,108,138,181,78,144,1,98,235,135,237,32,99,134,16,77,95,4,215,188,160,152,78,58,24,239,68,215,236,221,158,53,11,245,49,142,40,86,36,90,66,48,225,171,112,233,175,246,222,233,170,35,229,2,61,139,5,15,141,73,137,188,175,238,30,218,17,79,90,53,43,131,143,125,130,254,219,26,49,117,62,34,251,53,196,42,216,97,185,152,134,25,124,242,161,56,3,66,248,216,33,235,33,220,248,94,36,78,136,85,108,75,170,178,179,168,123,215,219,70,48,1,176,195,148,189,14,116,208,63,151,156,35,164,1,157,219,46,116,118,138,115,72,233,216,28,172,230,103,33,138,157,70,109,37,248,124,59,49,83,203,137,186,100,226,10,80,13,239,182,54,139,31,195,61,53,15,187,206,186,252,81,8,255,12,157,34,216,81,122,125,1,75,138,150,214,139,64,12,199,23,237,242,189,145,138,240,200,177,151,47,1,195,39,197,23,222,56,199,211,68,54,0,58,134,155,137,178,161,162,19,216,90,126,98,221,28,165,56,219,73,95,28,144,107,171,17,100,98,6,0,240,244,108,113,102,118,15,246,89,27,209,86,74,51,203,237,102,99,127,155,76,182,251,144,202,97,33,152,195,225,120,112,123,175,12,205,89,101,22,54,55,75,68,56,191,221,247,157,36,16,124,230,245,137,80,242,248,86,1,82,254,14,100,62,205,255,34,109,95,210,63,192,219,78,60,89,145,111,61,173,88,56,177,85,89,221,29,154,62,154,57,219,203,174,194,22,1,60,64,67,88,149,26,114,41,99,172,45,0,0,0,16,115,105,103,109,97,95,52,95,108,97,103,114,97,110,103,101,0,0,0,16,18,233,76,93,171,141,87,229,230,139,134,77,45,136,34,96,209,90,91,63,102,89,87,177,120,202,102,31,228,53,56,12,180,101,190,71,79,64,83,121,98,117,241,57,146,231,161,116,240,107,134,7,159,143,175,88,212,210,67,87,20,226,205,11,91,37,134,198,243,18,38,174,254,144,62,125,40,250,225,121,7,238,248,177,220,222,23,33,15,169,31,3,119,103,101,23,179,173,80,90,166,93,194,109,93,19,128,143,189,210,107,59,179,188,41,62,133,213,53,227,102,171,254,155,62,46,132,22,229,69,174,172,45,108,238,85,239,75,23,76,209,220,136,80,124,52,35,90,226,2,145,241,224,228,105,143,165,134,168,31,198,169,141,192,170,77,111,109,206,24,222,97,78,65,20,50,140,245,14,178,5,154,126,122,26,103,105,64,190,29,141,14,174,187,15,253,249,253,165,102,215,152,241,179,178,104,156,75,85,45,191,21,54,7,62,148,29,120,47,220,179,48,166,31,27,0,0,80,154,230,212,40,82,223,142,214,164,127,121,61,211,81,164,168,63,90,119,112,102,228,59,192,29,70,148,26,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,239,22,179,146,232,103,138,94,170,228,50,44,27,96,17,200,139,253,37,66,80,236,248,6,177,213,202,193,142,24,44,36,77,154,65,168,68,181,142,202,46,251,199,63,182,0,146,179,108,236,250,121,23,182,160,95,85,205,237,137,94,108,150,36,23,127,99,48,16,51,91,89,128,175,228,251,207,149,95,75,185,38,31,114,83,205,193,5,159,245,20,131,208,98,41,29,58,115,245,55,230,7,249,94,21,28,29,123,194,183,177,126,135,115,71,94,171,54,88,42,119,35,20,148,175,198,57,36,28,186,81,67,102,137,243,237,161,36,162,45,119,11,171,215,224,35,94,39,212,66,191,198,72,187,199,81,205,199,187,16,59,86,114,47,233,167,114,214,194,87,219,23,250,166,31,246,208,98,114,207,176,171,209,61,15,57,200,160,180,48,215,33,97,250,194,152,33,159,107,13,113,14,8,123,229,16,100,93,67,22,248,61,52,255,119,115,106,201,10,86,199,47,153,27,0,0,0,13,116,97,98,108,101,95,118,97,108,117,101,95,49,0,0,0,16,253,255,255,47,68,31,90,52,76,174,211,146,38,71,100,135,232,246,123,123,220,46,15,215,130,31,107,92,167,20,211,46,66,171,35,91,184,96,144,102,117,242,109,44,83,104,7,132,120,43,156,180,69,60,152,123,180,69,188,165,96,11,196,4,47,29,66,12,197,122,137,233,42,72,106,132,45,155,251,23,98,201,206,229,114,44,5,245,52,187,103,183,16,74,23,15,172,196,208,238,218,251,49,160,122,184,187,91,114,176,92,40,251,244,47,167,109,39,85,247,59,249,34,173,246,93,43,33,168,179,37,187,204,112,159,14,180,80,135,102,79,87,98,125,59,187,166,118,109,248,48,60,145,94,4,51,203,136,80,20,199,25,238,33,198,3,67,5,34,1,41,17,223,5,17,121,229,199,164,33,225,6,30,100,55,181,249,229,103,146,175,39,13,9,198,133,18,154,84,111,120,253,131,251,29,58,105,24,202,71,158,93,60,209,69,184,50,59,112,51,8,140,126,46,118,247,161,59,36,61,205,61,63,143,236,116,40,135,128,243,193,59,24,99,84,210,155,32,14,87,210,51,179,217,13,16,5,0,0,176,227,203,105,83,214,50,159,96,106,137,3,201,209,185,134,135,144,92,145,153,208,32,248,101,62,136,245,49,191,84,220,148,219,148,81,221,27,126,75,77,245,127,44,164,228,44,229,204,112,9,184,60,117,90,117,59,18,67,160,43,210,226,189,227,206,122,88,90,102,40,79,245,26,77,56,16,251,142,178,155,67,25,75,195,244,228,201,41,98,4,77,33,85,59,47,1,185,249,175,163,22,184,253,29,214,55,215,255,97,99,81,218,72,30,251,192,237,166,14,52,124,240,56,15,89,76,218,52,199,132,66,53,221,31,50,19,249,144,209,170,33,157,218,10,73,77,31,124,152,65,45,174,167,197,19,28,58,230,17,206,205,241,158,62,111,111,144,104,105,226,34,175,119,144,220,95,213,62,50,84,242,234,55,251,10,188,180,8,245,246,57,90,21,81,111,24,170,227,238,247,114,150,254,55,240,104,100,165,48,186,90,184,32,5,243,142,221,16,74,50,139,8,94,180,111,184,20,6,82,225,204,4,32,97,179,52,155,28,105,30,98,115,180,151,27,73,95,173,191,116,86,32,0,0,0,17,116,97,98,108,101,95,118,97,108,117,101,95,49,95,102,102,116,0,0,0,64,140,103,87,66,166,138,247,159,31,154,36,121,27,152,208,193,182,71,14,162,66,134,110,190,60,11,96,145,210,46,198,95,108,227,22,21,195,139,240,147,205,30,117,36,166,25,81,67,39,147,155,237,59,8,108,121,44,115,80,21,63,134,227,73,231,126,174,61,98,20,150,255,253,37,63,92,122,100,59,77,90,38,219,113,174,56,146,157,24,83,226,159,234,123,140,2,232,45,149,145,108,19,155,216,138,244,173,56,43,250,71,246,66,33,59,153,249,80,120,210,209,90,128,255,196,198,145,85,244,70,240,104,143,199,50,213,73,51,146,54,30,61,126,10,4,93,101,150,216,149,79,229,242,12,27,224,27,33,228,85,100,232,226,122,182,17,216,186,114,187,122,134,198,82,59,5,192,57,90,9,176,118,154,17,226,119,178,199,193,180,95,74,45,233,188,178,46,160,162,13,134,80,217,211,161,149,21,247,130,185,30,181,210,219,218,189,104,39,246,148,162,189,148,3,49,171,101,159,133,91,159,173,109,132,64,178,71,20,12,78,178,231,161,233,124,188,66,10,59,222,121,111,155,117,167,21,154,142,187,119,202,36,174,24,40,2,186,245,49,221,178,166,130,8,59,40,168,203,106,153,173,160,43,134,220,54,78,93,216,166,108,139,69,1,34,227,150,81,203,200,205,171,214,84,20,251,222,235,176,176,178,86,194,79,191,60,84,129,135,29,210,192,225,172,200,213,42,48,204,118,231,75,243,120,198,171,213,196,111,84,229,60,179,25,213,128,153,216,253,77,207,37,196,139,40,2,230,140,30,28,65,96,64,181,19,157,238,85,132,116,58,92,19,177,25,147,93,53,129,5,116,1,212,14,13,79,111,49,248,192,107,243,73,166,236,215,25,90,75,34,72,202,18,50,99,26,128,172,157,170,144,245,72,116,69,25,255,173,143,176,144,53,144,188,53,176,244,29,77,137,110,163,227,90,183,189,40,110,96,23,116,97,130,251,224,174,62,67,44,211,245,181,92,71,120,49,28,47,7,115,210,153,236,247,51,233,52,247,184,75,151,70,110,144,227,196,200,126,177,31,67,53,141,14,75,37,184,149,244,47,175,20,37,163,41,88,242,172,249,9,215,37,171,85,120,17,7,110,186,187,239,16,211,86,145,183,57,87,248,170,149,49,208,110,174,2,248,89,26,112,146,211,7,242,223,32,215,252,173,33,150,45,6,17,209,93,206,10,126,38,215,110,166,141,90,242,153,54,151,91,107,248,39,253,168,66,96,3,116,13,80,90,216,108,158,18,51,67,43,158,183,33,138,102,132,223,242,24,131,117,49,235,159,237,223,81,234,154,25,236,242,248,109,61,103,123,118,50,57,37,107,24,161,58,37,148,101,208,95,35,125,75,120,55,101,214,33,62,237,44,78,74,53,28,212,45,16,51,212,12,116,191,250,51,133,223,133,58,157,170,20,31,217,87,12,205,8,239,115,103,253,118,13,4,215,108,236,254,125,188,142,82,229,83,188,237,243,200,124,93,123,43,227,148,16,54,54,45,76,248,126,39,23,229,21,198,91,179,220,110,27,214,157,30,175,184,38,53,63,38,19,86,24,249,255,208,210,51,30,158,25,20,22,239,161,174,254,149,117,213,81,227,74,152,243,4,171,43,214,174,58,211,82,169,115,22,2,171,15,83,0,24,57,21,24,216,43,200,21,147,123,37,194,15,152,179,129,42,170,65,48,14,36,222,136,239,56,105,26,223,99,134,196,125,69,148,254,217,229,135,70,208,247,17,109,56,216,250,95,30,79,239,28,216,201,131,152,4,204,148,109,44,221,235,85,126,162,130,153,145,159,235,89,42,232,36,190,31,113,193,127,47,192,211,58,78,101,146,41,58,38,187,59,237,62,167,23,250,164,34,87,48,200,124,231,97,187,242,95,151,171,3,2,63,178,120,60,111,238,57,52,247,122,93,60,54,22,160,160,203,58,214,221,169,140,29,85,14,40,73,52,181,182,247,12,46,144,77,52,126,126,98,36,104,48,20,99,181,128,145,91,4,224,78,181,41,191,3,142,113,235,217,125,57,3,61,166,25,216,171,30,221,29,2,124,111,156,78,143,77,22,43,95,193,220,144,3,147,191,40,21,44,64,242,226,117,74,133,94,89,207,193,180,26,8,2,13,2,253,57,56,113,2,241,9,216,249,202,242,244,245,252,207,114,196,62,130,50,184,151,182,35,1,162,29,29,150,73,5,185,185,111,223,254,159,117,20,25,125,151,88,154,197,31,105,22,133,4,168,120,35,202,224,37,70,79,93,168,4,162,156,224,214,219,200,65,52,46,167,226,98,97,237,116,178,248,126,233,203,47,5,243,254,179,249,87,158,4,25,144,86,251,185,217,25,26,56,0,158,69,107,255,195,5,106,249,112,162,118,189,29,206,190,137,215,141,12,87,75,185,181,51,144,110,25,172,246,20,20,234,168,113,193,18,38,6,195,197,19,55,107,211,251,119,149,78,160,197,183,76,128,7,0,182,41,216,63,89,193,129,156,36,97,137,106,119,121,35,247,233,35,207,45,252,132,98,233,194,209,103,202,88,180,118,127,92,136,12,251,208,53,70,142,137,184,41,12,202,52,69,138,139,225,68,105,158,50,213,34,6,127,110,111,53,122,217,208,226,239,173,23,20,106,46,243,175,22,171,198,253,244,19,148,37,116,10,61,209,61,232,6,178,184,87,51,55,13,47,238,121,47,220,39,48,194,86,175,219,106,95,32,80,73,241,59,223,67,37,6,170,90,105,44,237,239,166,196,81,31,78,104,118,212,103,55,63,177,188,121,123,251,186,107,189,122,17,49,28,152,234,73,85,243,107,119,181,201,138,165,59,204,194,151,165,11,192,155,66,36,183,199,87,159,23,43,178,219,135,97,82,78,97,211,48,59,116,44,190,175,101,150,42,90,8,121,64,149,92,130,158,29,191,165,143,109,235,140,13,77,216,71,205,185,24,112,206,146,139,213,169,52,243,149,14,208,99,192,158,56,205,227,241,55,227,219,81,194,151,135,150,77,246,128,178,25,115,64,89,31,161,231,159,168,83,24,34,208,120,51,71,248,232,15,89,14,151,94,179,35,141,27,83,120,70,100,2,217,95,216,127,174,210,12,196,153,61,174,92,213,15,90,134,204,205,242,97,81,186,2,190,99,8,51,107,99,168,126,208,176,55,19,150,152,230,189,14,237,186,89,83,9,235,140,186,228,94,148,207,209,210,179,247,0,35,48,108,31,176,53,213,25,76,29,130,108,198,21,223,160,58,231,23,252,99,163,165,182,69,244,182,210,26,56,237,27,24,219,45,103,252,103,85,40,190,139,198,233,60,70,207,181,243,88,38,253,64,36,254,28,94,70,68,132,111,86,72,115,92,236,66,68,32,249,187,128,217,106,66,215,56,242,29,86,3,180,77,229,196,36,113,113,91,183,200,182,100,148,13,124,11,13,81,45,247,114,247,181,61,208,228,249,52,239,160,154,162,199,37,57,53,164,197,58,164,36,26,70,22,74,225,235,40,152,159,252,252,45,36,23,147,9,83,222,212,232,9,139,117,122,18,27,129,208,123,167,81,154,182,119,53,22,88,52,155,44,199,130,72,67,74,52,241,3,150,56,217,86,215,123,33,68,1,163,239,191,255,179,87,16,133,198,90,123,79,233,177,71,204,206,238,52,255,159,161,23,184,235,46,73,6,176,230,186,70,236,25,41,109,147,11,201,115,218,12,99,118,254,195,5,189,221,220,98,61,9,21,1,148,194,66,104,221,182,207,207,17,47,138,92,221,252,25,203,149,211,221,206,178,155,248,30,246,67,107,21,25,86,66,180,165,238,147,147,51,187,243,21,42,191,77,24,220,58,195,156,98,58,180,71,156,186,114,26,132,215,69,74,213,197,55,220,170,144,29,239,196,18,55,177,52,21,122,59,55,144,77,183,54,246,152,57,208,109,198,143,119,30,112,15,209,173,56,121,157,247,216,196,141,90,101,65,88,20,203,206,225,60,53,194,144,128,174,118,56,78,6,56,102,40,0,166,76,67,211,60,131,115,46,200,216,138,211,224,8,157,186,196,86,57,129,209,38,34,118,251,68,125,57,236,14,146,4,95,41,117,79,80,154,250,112,149,73,228,113,216,73,52,154,1,224,121,141,147,55,131,179,151,205,131,57,164,251,238,125,243,83,164,218,230,222,141,223,222,235,53,174,167,28,88,221,17,16,169,40,9,17,52,217,22,150,23,165,214,92,61,209,105,248,161,24,78,232,225,227,60,234,196,173,67,0,170,139,177,34,106,87,141,235,217,66,94,227,79,118,222,73,106,186,114,68,206,133,75,70,114,121,38,236,96,65,79,58,204,70,142,30,104,6,21,228,124,39,183,137,27,243,93,81,122,56,209,165,71,221,164,229,205,161,220,6,0,103,231,2,23,89,137,134,205,111,134,248,88,49,26,72,105,186,207,35,103,153,114,184,75,229,37,192,34,86,223,81,141,160,80,12,159,163,230,145,230,215,4,165,179,246,186,22,169,244,133,52,165,207,12,234,98,124,87,200,124,99,117,98,239,23,167,89,0,0,0,22,116,97,98,108,101,95,118,97,108,117,101,95,49,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,255,255,239,151,144,100,75,64,76,93,11,42,214,57,27,19,65,43,33,22,216,62,164,187,149,201,148,186,177,80,23,0,0,0,13,116,97,98,108,101,95,118,97,108,117,101,95,50,0,0,0,16,252,255,255,63,176,41,120,240,186,61,26,25,222,94,48,95,139,158,250,249,37,233,190,30,89,127,57,123,52,198,110,14,51,164,102,85,24,96,3,61,120,164,145,213,235,71,51,219,186,248,148,239,184,208,39,74,166,251,223,25,179,77,125,45,243,244,156,118,204,110,82,237,143,151,66,4,34,230,84,93,135,33,192,3,161,160,33,46,210,130,116,89,198,150,97,20,101,42,98,45,45,38,54,216,132,178,96,227,123,20,15,193,186,158,30,117,97,149,241,75,86,227,229,144,32,251,238,35,161,130,19,112,100,97,205,123,243,188,165,215,88,129,230,127,159,189,95,22,94,36,165,62,43,241,255,108,2,89,35,38,66,241,193,168,177,198,186,52,107,186,40,52,74,204,26,249,203,215,188,238,176,32,183,147,241,198,44,214,83,32,229,30,35,223,235,108,150,128,253,70,91,14,23,243,44,94,92,116,73,62,32,90,245,218,212,58,16,232,228,89,174,161,52,30,21,204,68,67,249,3,78,162,193,93,97,106,10,65,109,150,2,178,196,85,146,109,155,4,243,152,155,82,196,158,83,9,5,0,0,176,227,203,105,83,214,50,159,96,106,137,3,201,209,185,134,135,144,92,145,153,208,32,248,101,62,136,245,33,207,91,153,138,15,139,192,74,170,60,225,29,165,136,52,117,255,183,109,19,180,186,120,38,173,68,131,168,50,79,75,51,14,11,99,121,199,134,143,86,1,217,118,117,38,2,223,202,213,54,193,125,21,165,46,138,87,29,189,135,172,183,2,28,156,213,157,194,102,207,171,107,12,190,88,150,204,211,36,103,162,185,98,12,85,176,94,108,211,188,75,80,82,83,117,12,96,125,236,127,47,148,20,200,157,179,19,162,239,102,77,168,189,154,33,107,88,33,171,121,254,174,49,116,112,245,64,10,191,14,62,71,226,46,39,15,38,182,144,69,254,27,25,47,145,128,196,146,5,37,153,36,56,217,4,11,31,46,127,17,222,32,20,131,253,116,228,252,53,98,162,134,27,138,215,179,19,26,97,39,193,106,123,125,25,184,76,135,196,172,47,18,236,51,187,172,154,241,147,161,207,18,88,15,62,167,198,145,90,166,188,43,36,216,180,179,54,7,150,142,174,175,16,39,0,0,0,17,116,97,98,108,101,95,118,97,108,117,101,95,50,95,102,102,116,0,0,0,64,214,90,137,226,146,231,40,124,5,150,178,77,250,118,75,100,21,229,183,87,237,71,199,69,60,1,128,251,249,47,26,23,9,33,46,108,163,250,193,5,157,160,135,90,19,166,82,83,238,190,102,63,248,171,116,56,227,81,42,128,128,19,134,15,37,180,39,108,225,191,138,154,52,221,19,238,223,170,4,151,233,48,120,219,54,195,15,122,179,252,163,106,114,55,203,6,102,156,97,72,96,170,82,21,65,30,103,125,89,164,120,53,179,14,0,102,14,173,87,249,13,13,203,20,0,66,179,92,220,76,4,119,143,105,126,224,157,166,62,240,103,148,7,115,126,145,107,32,37,110,144,154,193,237,31,102,201,75,101,12,193,123,32,101,120,111,211,199,176,170,222,21,124,169,221,234,81,46,118,94,26,210,49,24,25,151,53,2,48,122,79,48,156,252,161,141,115,167,94,246,229,152,215,65,68,84,32,227,46,103,23,101,121,65,49,121,116,157,103,207,221,165,27,32,33,36,174,88,116,107,156,187,129,177,237,67,168,77,35,156,117,105,166,201,0,78,215,198,158,99,151,167,34,204,242,83,123,218,181,105,89,9,53,246,1,127,134,145,161,224,175,133,203,12,41,63,161,96,43,15,54,179,74,53,62,181,159,44,192,180,181,161,24,37,166,248,110,227,87,149,164,127,96,33,148,117,50,171,142,24,119,3,217,171,69,45,189,85,64,64,227,144,244,109,207,108,61,146,20,179,8,0,142,185,167,144,99,190,13,48,29,95,175,255,209,208,98,143,153,194,195,16,191,236,171,215,163,24,33,137,70,104,176,89,213,212,23,93,143,83,63,249,212,127,6,10,208,249,75,91,232,86,16,16,79,64,227,38,127,135,238,69,85,91,42,196,51,225,171,52,206,150,245,108,125,92,212,99,166,139,31,3,227,133,188,71,211,81,70,211,99,28,23,162,132,71,161,157,99,50,204,126,87,73,250,0,136,117,153,157,9,140,164,33,100,219,91,12,26,250,116,202,29,166,161,201,216,162,180,126,54,89,132,148,46,223,248,53,118,37,9,143,105,252,229,52,51,47,52,18,180,249,24,153,149,160,27,149,96,136,179,49,73,180,254,18,247,210,68,129,156,242,10,167,97,224,108,117,53,70,164,54,187,200,50,32,52,211,193,130,255,196,63,209,224,147,175,119,129,110,213,134,99,60,244,149,107,63,114,24,95,6,222,70,77,144,95,226,230,63,22,221,18,80,189,17,118,210,52,53,23,219,117,135,18,237,246,222,228,235,103,36,182,68,35,16,34,222,174,148,168,35,19,138,219,144,214,15,84,61,207,172,31,94,125,99,162,109,34,79,181,69,251,191,142,97,179,58,169,189,30,209,196,206,22,200,194,248,83,45,71,153,224,168,206,27,48,36,86,217,88,17,82,17,88,138,20,101,32,42,18,250,164,93,60,103,132,187,67,72,242,103,141,33,68,11,151,234,230,3,220,165,19,140,20,43,249,242,106,168,11,41,227,90,225,146,194,1,149,75,63,203,185,191,78,95,178,37,191,141,212,181,70,116,86,47,3,213,16,27,229,16,68,45,106,157,148,93,135,44,96,233,45,40,111,55,163,142,251,198,190,69,250,122,217,97,96,186,221,212,4,43,154,195,12,90,79,175,18,140,210,53,13,41,143,220,164,214,25,80,107,85,207,251,15,224,144,96,206,150,172,0,231,238,233,77,54,66,120,156,9,18,185,71,217,34,144,180,189,114,53,64,140,193,59,231,232,235,239,92,148,45,112,227,237,108,172,66,215,24,149,88,31,94,132,191,182,242,50,138,202,83,5,120,105,177,249,217,218,188,151,150,178,215,141,10,177,137,119,142,58,23,15,16,21,122,4,105,32,123,45,154,156,92,230,12,187,230,42,13,221,178,119,129,106,156,118,81,118,173,49,224,221,19,192,130,129,176,113,71,60,211,118,135,81,85,134,22,24,187,28,137,196,246,234,165,238,245,29,159,164,136,251,202,143,9,7,84,99,3,229,17,200,220,100,123,190,151,99,128,116,103,60,136,175,237,75,155,116,248,204,54,174,30,63,220,234,43,211,228,139,31,255,104,248,92,55,132,123,94,223,64,123,142,254,158,193,92,159,34,145,252,127,123,184,221,251,226,41,16,160,124,238,32,121,239,234,27,3,56,57,220,5,203,253,95,119,176,166,211,156,64,77,14,245,91,107,126,21,102,151,26,215,196,138,235,248,222,94,69,179,58,30,155,151,113,244,135,168,23,22,136,192,181,32,217,253,76,104,27,20,94,67,69,224,21,101,30,3,17,34,164,212,234,235,99,185,141,248,27,105,66,234,188,193,230,235,229,150,99,54,43,206,124,217,38,85,26,27,212,247,216,247,157,205,147,119,197,46,159,51,179,70,103,156,247,140,160,253,200,210,89,229,110,244,2,250,53,17,222,4,60,183,15,35,148,145,186,124,52,186,235,153,159,60,155,221,117,146,191,74,12,241,217,42,242,208,87,3,71,202,178,42,229,31,49,25,158,48,236,45,65,78,207,144,38,48,214,202,145,66,199,166,235,158,106,6,253,43,188,237,63,238,21,138,9,197,244,5,185,234,70,237,18,160,122,158,61,24,147,171,215,219,33,98,190,4,71,182,145,218,209,4,74,153,235,12,147,164,1,126,158,255,185,106,172,137,154,210,126,197,190,159,146,34,83,47,113,131,171,238,250,35,205,154,35,162,93,23,48,247,103,0,148,132,62,55,108,162,51,132,200,224,178,9,165,241,154,191,29,231,121,148,44,97,240,6,20,247,169,155,41,157,47,36,202,118,0,62,37,65,179,227,101,247,68,85,169,158,110,193,107,160,215,90,23,228,92,166,68,7,19,15,254,169,193,60,112,6,102,71,163,17,20,140,59,69,24,62,216,69,208,4,250,206,189,57,205,49,15,224,13,12,201,45,179,179,144,103,224,71,252,169,156,170,173,250,71,153,155,205,136,213,185,150,107,45,103,116,146,16,101,188,7,33,108,80,177,118,204,192,132,161,16,27,176,79,236,86,0,181,66,139,171,201,186,149,184,126,14,213,12,123,64,206,20,139,109,34,93,206,70,239,241,104,8,237,221,72,155,212,49,165,158,192,235,201,204,132,167,104,153,49,179,243,30,3,52,123,230,54,248,231,148,231,117,229,15,250,137,29,184,233,29,92,193,231,42,207,48,147,197,162,161,2,92,132,53,223,37,75,169,24,182,112,132,16,139,195,155,42,79,70,8,117,39,65,45,49,30,64,20,4,94,212,73,128,224,61,140,98,86,252,86,198,216,97,157,126,7,234,151,58,20,225,252,19,127,57,196,91,50,147,122,135,212,181,76,71,150,128,119,172,57,18,241,81,191,125,17,164,217,109,47,142,217,118,187,123,218,236,112,216,64,124,16,237,13,59,240,172,13,105,82,37,80,163,42,61,225,31,203,105,170,63,201,121,130,216,27,219,97,136,140,199,193,242,254,74,123,110,225,164,230,110,174,6,53,169,57,199,76,43,129,235,3,118,196,17,123,212,115,88,4,72,240,103,221,88,221,35,48,9,132,110,163,25,45,63,48,52,225,33,90,92,244,81,123,15,196,222,11,138,134,100,251,102,118,149,50,187,82,75,18,227,184,249,146,19,62,237,69,239,152,186,195,216,68,1,186,27,176,10,0,74,38,166,221,33,140,108,7,183,128,154,163,146,10,150,119,179,253,0,0,106,49,151,187,3,208,35,60,188,125,173,215,144,241,180,212,123,252,255,129,226,20,145,141,239,18,203,36,53,92,42,3,179,149,121,238,72,219,238,167,6,143,47,97,89,139,80,99,145,251,161,208,1,163,52,88,155,173,78,181,233,35,160,49,228,254,196,199,26,86,49,239,26,167,52,96,141,87,186,47,146,117,5,92,83,128,90,160,167,162,182,71,98,61,252,44,235,110,128,162,166,116,188,177,194,43,96,200,253,133,163,192,102,68,47,150,54,7,151,13,223,210,244,250,122,131,47,43,172,6,160,228,149,4,95,139,156,173,228,54,29,239,69,236,136,216,223,105,63,213,124,134,209,39,181,246,243,136,2,58,213,116,170,196,13,116,91,80,201,198,126,126,4,227,140,47,96,240,49,141,44,18,235,63,111,162,3,8,84,228,24,92,185,17,87,253,251,124,118,169,217,162,138,26,127,46,191,0,1,174,72,177,171,240,4,215,74,50,253,170,177,219,77,63,118,90,19,188,209,136,76,194,100,1,144,47,58,19,131,175,126,24,31,207,162,247,20,92,108,204,174,212,131,15,207,64,247,1,235,98,134,213,166,154,194,111,248,82,215,27,31,33,49,184,186,221,159,127,201,31,11,30,197,163,77,43,182,6,93,119,111,118,155,113,193,161,28,192,219,127,8,114,208,130,132,82,77,158,13,69,29,14,159,4,111,7,64,90,37,3,46,203,20,171,185,123,238,102,81,89,3,69,53,101,105,199,109,37,113,103,164,81,106,55,155,138,101,96,252,68,62,1,149,134,100,231,136,40,84,219,214,200,81,239,214,75,216,107,64,162,0,176,34,65,26,141,204,184,10,123,60,110,95,4,0,0,0,22,116,97,98,108,101,95,118,97,108,117,101,95,50,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,255,255,63,180,196,250,247,105,25,190,170,191,76,54,82,65,135,164,153,133,123,173,10,235,116,209,46,124,41,91,37,0,0,0,13,116,97,98,108,101,95,118,97,108,117,101,95,51,0,0,0,16,252,255,255,63,176,41,120,240,186,61,26,25,222,94,48,95,139,158,250,249,37,233,190,30,89,127,57,123,52,198,110,30,35,157,169,95,228,105,148,207,233,229,251,4,60,63,43,10,160,109,12,169,117,31,103,96,110,17,210,172,146,65,210,37,183,204,247,224,211,98,27,241,244,230,26,132,22,49,174,162,172,121,177,33,207,20,62,103,111,74,129,251,123,227,171,25,30,144,243,107,127,80,58,16,143,172,5,107,133,120,193,89,122,72,13,67,85,3,142,160,112,205,168,116,74,152,178,38,153,81,1,53,104,92,25,165,161,184,10,207,25,195,54,90,166,103,151,52,152,10,201,136,155,227,201,197,198,218,145,7,189,200,149,47,157,137,50,100,180,115,40,87,181,146,36,121,178,231,212,187,128,58,80,195,171,216,95,198,63,174,26,22,57,181,17,84,26,103,166,30,62,31,170,234,59,130,79,208,200,52,162,86,174,228,99,189,237,148,89,128,84,183,234,13,180,160,231,74,206,202,206,6,68,44,214,95,236,250,89,57,67,40,113,72,208,8,155,232,215,218,100,113,213,99,153,2,5,0,0,176,227,203,105,83,214,50,159,96,106,137,3,201,209,185,134,135,144,92,145,153,208,32,248,101,62,136,245,17,222,98,86,144,175,139,77,116,167,138,189,116,12,169,8,30,189,234,116,216,64,38,233,87,187,142,95,52,224,12,146,10,74,51,8,15,192,146,198,82,156,137,158,245,49,183,133,133,176,222,207,95,231,48,18,81,186,85,176,229,246,106,184,22,227,111,12,132,20,165,167,51,2,196,179,14,195,111,114,206,226,15,116,62,97,66,194,23,185,210,136,108,40,182,177,9,104,174,254,186,43,153,200,158,239,183,174,170,46,37,253,205,182,240,233,76,30,59,135,47,142,188,103,27,172,115,210,40,68,55,106,192,246,107,175,223,220,252,144,34,147,85,15,175,170,112,172,197,53,11,0,245,125,199,209,26,51,160,73,26,200,74,238,155,121,142,59,37,83,81,15,143,12,102,228,87,148,35,223,42,8,97,236,250,59,11,216,96,30,151,121,34,77,95,24,165,197,42,19,61,77,68,227,25,92,237,217,238,25,48,16,57,230,60,181,207,81,197,204,111,157,234,202,45,0,0,0,17,116,97,98,108,101,95,118,97,108,117,101,95,51,95,102,102,116,0,0,0,64,35,78,187,82,59,37,0,36,159,227,108,143,178,14,98,127,139,139,229,145,187,218,16,246,184,215,52,9,122,28,155,95,168,94,69,163,171,84,87,255,142,3,13,132,17,3,188,179,111,155,52,148,33,219,29,104,237,112,103,173,167,61,241,53,99,233,160,154,96,107,127,53,107,148,232,127,69,241,205,224,120,59,21,69,191,77,141,86,78,166,101,53,250,242,9,11,227,10,46,15,192,75,40,14,102,215,102,72,63,102,117,76,198,163,67,177,108,195,230,103,32,31,228,72,200,110,112,51,199,82,24,85,75,236,111,183,165,107,23,23,139,164,44,84,16,207,245,46,149,23,194,120,13,175,185,143,207,97,19,84,31,15,94,63,206,194,176,24,128,10,252,30,122,232,179,248,64,123,19,53,59,115,25,215,121,86,234,29,17,142,163,70,10,16,135,120,36,185,56,155,180,112,28,54,158,42,247,166,125,188,142,147,105,97,55,124,86,115,167,40,166,63,62,12,14,157,246,65,167,154,243,253,225,140,110,104,47,206,158,113,33,226,38,37,97,14,123,90,133,8,32,60,81,55,17,1,94,38,176,59,16,217,127,91,254,220,197,32,162,180,20,181,206,193,25,89,7,129,140,245,17,6,205,166,133,208,185,92,166,194,254,215,195,93,102,134,36,148,113,110,234,130,130,157,89,63,131,103,255,244,154,63,156,199,104,91,64,141,48,2,245,96,7,31,106,249,49,56,238,95,227,45,113,226,188,157,78,16,45,141,11,199,251,157,248,192,93,39,168,133,28,44,187,77,47,157,245,153,5,58,221,224,217,119,223,244,116,140,247,138,197,23,77,148,67,57,108,94,72,146,207,250,176,65,143,49,87,60,222,98,173,16,62,47,245,188,188,151,164,246,153,178,213,164,42,19,136,170,91,44,75,78,151,250,106,21,169,245,252,213,94,238,97,15,246,191,192,16,11,172,145,170,133,232,63,71,84,8,115,148,242,246,41,10,205,164,65,54,9,33,244,206,114,250,172,165,38,135,27,4,227,0,80,89,134,45,62,246,233,68,203,143,142,8,26,134,16,46,27,53,36,190,164,51,76,38,157,80,59,112,254,212,36,221,159,165,158,160,14,119,171,121,26,64,33,15,161,155,61,130,244,43,162,58,212,152,154,89,169,22,216,231,245,185,202,60,51,109,139,20,151,184,8,65,184,82,214,225,4,46,181,144,81,76,201,194,240,185,79,89,85,75,127,18,32,49,82,110,210,14,195,189,195,17,124,151,141,186,85,202,127,238,147,28,168,13,17,121,50,139,153,37,156,173,50,66,186,6,37,5,109,110,159,206,26,117,90,64,43,178,119,146,136,66,182,71,240,66,25,86,210,137,232,98,8,252,31,33,72,55,17,231,72,26,56,97,62,10,191,133,99,216,110,6,220,230,24,151,108,71,177,52,79,119,135,228,100,128,123,86,137,42,138,211,175,113,130,62,219,33,113,26,106,204,123,137,55,200,202,226,236,47,225,97,6,56,145,58,173,57,3,107,144,234,140,136,46,30,50,35,42,68,118,3,151,152,170,246,68,199,174,75,234,59,34,130,2,182,19,82,7,177,143,5,178,48,154,48,61,119,76,110,90,130,237,67,209,181,200,243,34,207,144,3,249,29,242,50,79,121,214,162,229,100,25,50,142,136,219,100,162,106,8,138,134,102,63,179,54,226,179,59,218,236,200,153,134,41,70,247,226,21,78,177,41,86,231,255,96,6,7,250,83,5,50,58,211,253,249,49,226,138,232,180,110,161,128,138,78,19,220,193,33,212,210,240,182,36,43,240,224,244,117,236,176,12,174,137,157,105,70,135,91,61,93,144,213,212,240,169,89,47,95,76,239,149,55,53,249,255,197,233,182,69,214,90,146,251,13,80,228,182,221,203,61,143,91,80,190,164,42,11,30,25,207,140,198,225,136,74,38,243,3,34,32,238,62,117,195,210,91,148,44,197,255,115,216,149,61,149,70,61,179,236,118,21,125,90,146,152,183,203,137,13,8,114,96,0,254,134,89,162,59,105,40,48,34,237,10,199,132,243,172,34,8,45,203,13,208,29,249,65,8,187,56,210,244,154,218,98,57,39,255,171,218,93,130,41,236,167,173,61,19,69,241,7,147,221,189,39,114,55,40,23,126,210,170,121,154,166,243,192,81,141,37,16,82,238,219,51,250,201,26,98,79,25,134,171,229,130,220,65,171,231,247,217,51,137,244,73,138,36,234,67,254,156,108,166,25,231,208,114,78,192,55,43,35,85,197,251,30,85,221,3,123,220,108,132,149,117,137,171,99,106,200,255,134,213,125,125,204,123,104,134,135,26,169,154,139,55,153,68,16,148,29,38,12,48,29,24,153,182,53,98,129,13,183,138,191,248,251,102,201,200,206,245,168,158,132,212,135,229,11,84,17,120,231,20,215,2,84,68,222,176,44,124,44,96,229,126,203,101,114,44,83,48,248,37,17,72,42,69,230,59,192,149,1,234,78,65,21,94,85,4,170,127,212,38,49,199,120,215,131,253,234,253,67,225,31,187,23,5,112,147,226,18,85,24,249,94,117,87,39,181,148,198,109,231,46,93,14,215,146,34,63,227,252,136,158,136,75,162,31,185,10,38,173,24,24,60,195,230,53,46,185,253,72,51,237,74,198,108,38,182,155,34,69,114,18,40,243,193,44,129,135,225,113,201,242,14,8,37,2,145,102,64,56,140,64,214,82,233,186,59,216,150,120,118,34,240,27,105,213,204,88,236,85,86,201,73,157,42,46,77,69,136,173,6,206,5,207,236,209,1,47,17,171,211,72,85,62,195,39,230,22,32,248,180,238,172,232,201,35,163,12,152,139,224,66,29,68,99,134,54,112,174,161,37,11,246,57,226,20,225,84,21,105,89,29,97,170,202,214,51,182,71,170,158,153,85,242,81,190,137,226,37,210,196,76,34,114,57,174,169,231,111,104,130,229,94,83,68,241,90,189,8,200,66,19,123,236,214,226,0,115,116,224,179,72,193,127,91,156,174,19,136,37,41,90,146,121,231,22,38,48,72,59,208,7,28,244,90,192,123,232,55,71,98,17,99,56,154,176,206,84,234,52,130,182,145,193,56,47,79,158,86,113,127,129,135,76,0,136,131,192,78,188,59,35,189,19,74,43,71,160,17,156,70,100,73,104,56,8,33,15,139,83,136,90,181,179,101,0,157,170,107,1,77,45,89,139,103,164,209,212,190,200,190,146,131,46,179,250,28,82,146,168,249,41,100,249,80,74,201,232,140,135,31,245,64,21,52,251,73,233,27,121,255,38,20,112,164,131,193,93,249,24,168,174,51,206,141,71,241,50,42,88,188,22,124,216,172,155,28,38,161,127,144,74,207,31,43,198,126,12,241,49,50,215,73,56,105,54,68,193,1,31,33,117,7,54,28,9,83,50,34,96,144,85,97,58,69,58,72,55,189,165,125,236,67,117,74,134,201,154,10,121,122,117,89,185,237,40,75,208,107,225,19,25,62,234,211,27,94,178,237,165,114,217,20,189,190,24,105,147,227,161,150,154,39,62,13,52,51,244,60,168,228,3,78,75,65,115,88,233,171,69,184,132,113,52,204,78,161,52,223,144,243,228,23,213,40,242,29,58,88,57,140,197,189,205,41,61,66,181,103,37,29,182,118,147,230,12,164,59,107,108,63,47,218,166,18,59,235,189,255,140,38,70,171,156,177,15,26,233,72,5,250,7,138,96,72,47,95,177,178,107,7,152,20,119,116,30,72,114,90,113,63,70,131,95,77,38,55,233,36,55,161,150,255,148,156,18,186,57,64,144,15,23,30,130,208,222,139,46,136,173,3,181,10,72,199,9,55,24,84,42,57,10,176,113,163,142,222,167,191,140,10,219,157,168,36,142,3,170,253,65,100,151,14,41,78,232,199,175,171,36,146,171,85,194,99,197,253,80,145,163,112,32,47,64,58,214,45,235,49,12,113,208,220,117,27,5,54,240,108,86,73,14,240,129,46,66,66,113,7,199,232,55,254,149,203,223,65,91,7,236,33,47,0,23,132,206,75,28,25,220,224,62,82,119,161,91,10,12,47,144,66,78,113,3,54,223,166,72,62,67,164,249,39,209,131,131,111,45,143,53,45,186,51,64,229,80,8,245,61,61,137,172,42,234,118,119,215,158,33,196,237,49,59,166,221,181,133,28,141,252,192,210,22,222,228,233,136,186,186,143,49,147,215,20,120,102,243,173,47,4,185,79,79,20,153,251,217,98,7,83,36,237,144,139,23,205,20,239,221,207,34,246,80,69,120,36,147,54,73,162,141,60,13,76,60,167,169,147,32,85,14,132,248,39,191,151,177,205,98,149,60,173,99,129,3,238,167,80,206,206,220,109,95,188,88,0,118,245,240,66,180,142,108,201,150,211,172,149,54,112,103,1,8,128,77,99,3,70,61,160,191,57,125,56,25,219,241,165,187,73,248,54,147,209,9,241,151,179,3,255,102,61,95,29,80,222,55,144,38,141,105,226,28,83,100,103,153,28,124,91,187,149,115,146,243,149,37,247,120,79,145,125,194,111,78,3,86,111,97,224,15,0,0,0,22,116,97,98,108,101,95,118,97,108,117,101,95,51,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,255,255,159,60,3,175,96,2,118,101,208,12,219,254,96,18,117,156,144,62,217,203,184,240,179,167,231,202,82,1,3,0,0,0,13,116,97,98,108,101,95,118,97,108,117,101,95,52,0,0,0,16,252,255,255,63,176,41,120,240,186,61,26,25,222,94,48,95,139,158,250,249,37,233,190,30,89,127,57,123,52,198,110,46,19,150,236,105,176,115,37,98,91,39,102,52,140,54,35,57,133,226,131,98,50,110,166,118,54,39,196,63,114,53,39,30,123,164,82,75,219,86,228,244,89,54,243,3,11,124,7,232,209,209,162,63,253,136,90,160,12,18,142,157,49,48,246,30,215,245,132,170,209,122,62,72,153,166,170,242,142,220,115,242,57,242,251,16,73,113,42,245,138,183,107,88,116,53,118,41,146,32,239,233,255,76,71,18,225,36,41,64,35,237,186,92,10,106,80,212,136,54,61,139,53,118,197,255,253,170,100,25,56,160,105,182,136,76,170,147,253,44,40,122,32,89,46,249,152,247,236,136,80,84,233,242,101,234,146,182,43,60,80,13,80,139,55,43,50,67,49,58,178,160,246,91,147,142,118,84,165,131,165,212,29,52,67,248,244,225,255,135,109,27,5,46,84,117,138,66,55,135,49,175,87,107,4,207,22,157,122,4,225,246,158,188,196,233,234,132,230,188,95,113,89,119,67,44,6,0,0,160,119,193,75,151,103,163,88,218,178,113,55,241,46,18,8,9,71,162,225,81,250,192,41,71,177,214,89,50,238,105,19,134,227,129,188,225,53,73,83,69,188,177,16,239,215,117,253,30,132,215,169,65,243,120,109,161,0,25,61,18,134,91,173,164,184,158,253,78,55,58,198,117,61,108,44,64,139,134,222,65,185,188,245,23,29,142,163,67,65,30,110,17,42,10,123,69,194,122,163,251,247,201,14,135,185,11,192,53,35,102,133,112,109,212,37,195,158,232,197,136,254,24,238,6,111,223,16,6,148,168,154,49,176,75,144,57,37,251,120,203,82,238,48,173,45,15,19,45,244,41,108,225,116,163,255,22,201,95,150,57,11,169,55,176,147,67,145,255,39,143,5,47,196,96,148,248,101,241,102,197,195,181,158,42,71,18,20,35,178,116,200,180,245,167,146,77,112,64,124,151,253,65,241,251,20,45,93,46,79,87,93,120,94,94,99,58,120,129,195,50,173,138,117,173,92,110,176,148,57,5,181,170,49,75,185,35,124,97,226,196,241,91,101,51,67,227,209,111,25,215,32,4,0,0,0,17,116,97,98,108,101,95,118,97,108,117,101,95,52,95,102,102,116,0,0,0,64,109,65,237,242,39,130,49,0,133,223,250,99,145,237,220,33,234,40,143,71,102,156,105,125,184,205,84,115,161,29,239,22,71,156,92,218,179,174,236,248,128,102,146,173,15,96,37,20,241,119,2,233,74,10,199,151,247,143,164,218,206,103,92,92,162,30,26,185,115,12,86,20,51,188,118,139,243,31,203,82,101,158,51,48,254,29,91,235,18,240,88,225,244,252,172,63,97,121,250,197,179,226,223,74,28,1,32,141,109,16,166,139,54,145,8,126,129,31,198,142,92,209,46,94,3,234,145,58,175,88,44,99,75,142,187,194,249,222,195,208,212,251,181,188,138,3,252,184,225,239,2,46,220,143,190,21,125,140,148,10,125,162,155,25,36,22,142,105,79,106,25,40,120,39,138,6,48,200,176,11,92,20,1,150,218,21,159,57,242,161,247,92,121,35,108,83,105,192,244,131,20,185,26,164,64,233,1,147,41,106,135,67,16,199,141,55,98,233,24,99,225,39,197,40,253,21,63,11,2,181,14,200,100,73,98,128,71,31,130,151,135,11,170,131,46,90,191,94,191,237,11,147,101,63,248,14,63,114,170,45,159,189,6,57,216,89,146,188,17,184,17,148,23,198,7,112,0,22,77,107,154,24,236,85,231,78,11,44,143,208,71,222,42,119,204,223,141,150,183,180,9,63,64,146,54,18,88,168,147,162,175,164,220,195,32,45,28,176,77,85,6,49,26,224,112,144,68,154,54,156,4,226,11,35,158,130,220,9,203,104,67,233,247,131,245,16,39,222,67,250,16,23,182,174,178,114,179,37,8,167,226,232,73,28,161,44,158,147,2,106,202,180,14,99,48,176,222,34,19,232,67,80,237,66,209,34,203,49,101,41,48,99,73,228,50,169,214,30,5,9,32,127,184,223,68,85,220,97,100,13,218,91,49,12,226,67,127,153,179,216,89,192,172,124,103,56,224,131,178,37,87,214,179,135,133,141,32,155,76,139,219,97,175,242,53,110,39,96,247,71,115,227,51,89,214,61,227,250,200,15,71,192,231,245,128,35,2,53,167,30,61,216,137,116,28,246,122,222,157,39,149,130,48,190,150,161,0,80,167,200,2,242,72,238,116,96,163,198,89,238,112,70,122,145,10,222,6,163,184,12,169,81,137,172,117,17,1,224,144,170,176,10,172,162,180,229,182,98,149,186,88,234,173,69,124,15,65,132,151,67,11,27,197,81,69,245,129,145,184,114,148,185,235,212,130,80,46,10,112,232,110,160,17,156,229,65,36,150,198,168,151,184,113,244,44,11,0,20,182,129,138,39,37,209,137,243,157,253,245,204,10,48,31,63,184,134,18,19,52,21,58,223,21,197,221,45,45,75,136,238,133,82,120,1,24,236,235,216,130,199,146,76,125,99,68,78,203,110,113,236,29,231,97,91,46,98,170,122,84,52,80,111,249,144,210,97,69,69,179,100,32,237,134,133,27,216,109,146,207,63,6,143,192,12,227,231,117,157,42,29,206,54,222,104,43,237,203,125,227,227,53,154,173,155,130,201,118,238,71,96,254,80,239,76,135,73,40,120,71,146,5,56,44,26,220,102,112,238,199,98,114,0,20,196,103,29,34,163,230,119,148,71,189,140,110,177,226,33,7,83,164,53,109,224,173,66,150,182,139,86,110,5,160,228,52,248,48,180,229,97,13,168,158,112,126,110,164,75,239,229,228,22,255,203,26,52,59,65,20,82,188,25,227,26,122,137,62,75,4,154,216,179,27,73,40,141,189,15,4,7,48,232,96,134,239,213,84,210,197,13,34,43,36,90,141,44,213,18,146,229,61,28,158,120,196,63,5,225,222,148,62,50,180,234,2,118,200,62,247,118,20,23,176,136,201,161,254,246,179,200,239,169,138,168,14,145,157,56,78,235,108,60,250,91,97,58,106,239,55,125,150,132,194,78,222,150,11,19,160,77,16,19,145,188,238,134,247,211,110,234,154,159,148,147,20,66,194,53,93,139,232,241,106,14,94,33,244,96,193,29,30,123,45,130,60,217,187,226,224,117,114,5,152,162,34,244,174,132,241,77,102,80,221,7,68,204,15,32,204,86,102,116,125,23,151,3,33,65,128,237,74,37,79,161,89,196,193,116,130,231,121,198,124,110,248,80,183,137,237,14,67,242,97,29,239,191,136,147,160,164,244,43,85,103,25,152,207,211,143,18,161,13,152,253,127,54,111,247,66,81,189,56,130,10,101,152,42,20,48,26,21,96,226,89,62,129,128,61,162,191,15,226,255,155,63,166,197,61,183,127,130,55,164,83,23,163,116,218,187,207,210,246,131,90,94,21,157,5,55,7,141,13,104,209,3,148,182,7,170,171,45,63,197,249,197,85,197,69,31,60,98,127,55,174,87,104,105,67,225,34,44,107,6,219,3,247,49,40,172,80,144,177,149,251,19,138,157,84,156,39,163,92,113,92,84,32,54,149,148,79,148,247,22,145,12,109,145,84,217,138,185,197,177,253,35,88,191,45,54,11,95,9,128,51,160,216,173,107,160,49,10,244,112,67,17,173,250,147,243,98,54,253,232,130,252,26,114,82,83,179,152,62,97,84,159,115,170,207,57,69,195,215,241,171,38,52,143,252,129,214,108,238,25,150,3,70,127,138,171,199,30,74,203,66,217,15,133,211,53,148,14,59,77,178,204,152,0,74,82,209,32,197,185,111,236,111,180,33,98,114,33,79,224,84,50,93,207,186,105,108,66,96,87,39,189,95,115,250,234,148,231,49,39,63,41,181,112,87,35,46,125,123,249,78,156,110,184,41,167,97,2,144,46,191,253,223,1,136,198,120,204,163,211,182,240,171,157,195,171,118,176,152,250,174,33,219,24,1,168,86,127,179,253,142,14,176,66,83,237,164,185,45,135,221,181,158,210,233,249,230,161,57,8,253,73,145,183,173,27,255,59,53,113,74,151,136,132,238,19,168,45,231,107,48,109,26,10,229,142,122,90,129,195,65,52,94,140,190,227,68,59,151,109,42,196,124,112,198,134,192,92,238,5,220,82,230,178,125,41,252,224,51,33,31,224,143,144,47,103,137,225,199,146,104,158,42,2,87,0,121,14,248,143,103,175,91,195,172,219,159,122,23,92,167,250,63,98,236,45,175,6,199,172,114,26,48,17,19,201,147,240,187,70,14,149,37,48,156,91,21,34,232,190,211,7,164,188,226,120,174,51,149,10,88,239,184,152,199,178,43,203,37,48,237,56,249,128,242,97,107,50,23,175,49,47,253,15,198,34,170,178,141,144,52,253,207,142,94,172,245,199,17,251,60,12,79,36,87,177,100,135,33,134,232,34,222,81,249,128,251,193,106,178,173,46,56,36,204,23,67,163,48,239,47,59,81,173,81,171,130,125,192,175,62,68,130,53,145,102,225,224,185,21,201,188,56,161,236,216,190,240,11,28,162,163,36,31,246,109,193,124,170,206,109,81,146,68,108,145,60,119,131,62,183,112,86,108,129,64,168,87,58,16,114,23,198,132,83,135,66,13,123,228,79,181,79,179,63,46,187,20,57,113,125,36,38,217,76,111,230,183,121,11,162,22,20,81,255,255,10,98,161,196,86,118,99,57,245,249,30,138,140,19,188,4,195,186,112,52,253,238,254,152,41,145,247,120,133,119,61,174,13,138,235,175,27,222,255,136,239,121,172,85,206,228,199,254,120,223,207,95,156,8,16,145,163,93,162,196,253,18,23,186,3,104,96,115,56,12,68,157,84,162,64,181,141,70,29,123,84,114,236,60,14,2,160,81,241,156,243,243,117,23,18,168,70,186,172,179,32,77,104,84,136,219,128,55,68,140,200,127,21,207,195,57,190,162,30,229,4,203,64,147,215,211,53,80,16,46,97,30,159,218,123,90,8,220,140,14,232,50,33,250,134,7,213,123,105,110,17,87,139,213,172,69,77,1,74,146,29,152,88,10,105,103,184,168,235,236,193,102,50,102,237,254,122,84,69,240,161,254,233,34,166,215,102,134,182,46,14,112,1,218,125,66,10,32,184,212,248,177,202,77,64,42,240,249,167,143,216,80,161,202,77,92,28,58,218,43,112,224,86,125,59,68,233,117,176,34,100,141,95,134,247,203,119,202,77,154,72,159,111,86,211,228,81,208,210,46,101,174,163,192,122,53,80,194,0,2,72,108,102,90,73,245,16,183,58,45,48,193,226,199,181,113,234,3,215,240,14,155,55,8,72,54,232,53,84,174,84,22,84,211,114,75,21,129,143,156,123,93,78,12,180,140,69,132,118,202,158,97,98,218,28,204,36,54,153,84,0,148,238,93,179,122,178,127,196,71,27,89,159,191,31,60,72,214,188,206,148,102,68,182,251,185,71,151,182,127,234,176,48,128,216,49,22,150,61,252,96,237,97,222,229,42,88,233,13,246,222,198,16,80,90,94,23,107,106,197,233,50,143,5,52,93,175,43,228,37,137,160,135,211,25,143,184,21,163,208,54,216,149,239,70,12,112,67,222,181,147,163,94,77,220,125,27,134,76,96,66,177,149,92,155,243,159,30,1,157,131,128,163,72,1,111,195,50,39,49,176,60,132,45,18,21,163,197,75,0,0,0,22,116,97,98,108,101,95,118,97,108,117,101,95,52,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,255,255,239,88,55,69,13,44,67,198,111,162,81,251,151,64,187,21,9,174,124,58,31,32,147,175,129,140,202,11,17,0,0,0,10,116,97,98,108,101,95,116,121,112,101,0,0,0,16,253,255,255,47,68,31,90,52,76,174,211,146,38,71,100,135,232,246,123,123,220,46,15,215,130,31,107,92,167,20,211,30,82,178,224,80,236,86,255,211,3,177,3,253,2,113,15,85,147,182,36,251,136,237,88,101,236,47,202,18,129,23,111,12,107,69,231,161,189,134,192,229,197,248,145,4,57,80,162,210,60,113,221,199,68,184,232,187,151,243,90,21,91,253,204,9,243,94,63,176,136,209,45,104,112,190,22,212,104,76,170,143,59,75,65,217,121,185,184,162,33,15,96,201,204,192,103,30,175,228,55,6,53,128,113,161,116,228,104,245,69,45,222,122,215,184,237,214,124,204,188,57,247,203,8,249,147,184,125,2,76,66,26,155,218,64,203,213,216,71,41,238,115,63,7,249,254,183,140,84,17,237,132,52,125,163,198,245,123,4,122,48,246,50,160,174,250,189,201,83,4,124,55,138,198,45,66,148,237,248,154,223,204,129,102,125,43,238,201,43,239,39,100,14,215,34,255,51,79,118,76,217,188,192,119,127,70,205,147,80,129,197,107,112,22,55,156,60,41,21,9,21,162,20,200,22,4,0,0,192,79,214,135,15,69,194,229,230,33,161,207,160,116,97,5,6,218,22,65,225,166,128,198,132,203,57,145,17,175,77,31,159,167,158,226,111,141,191,181,124,69,119,36,211,201,161,92,134,45,88,247,82,61,112,103,206,241,54,245,35,150,186,24,78,214,110,33,94,203,119,39,117,15,152,145,85,32,231,163,185,113,141,103,252,145,172,214,203,23,81,151,38,14,161,192,63,11,36,180,219,32,178,162,165,223,155,137,152,33,13,64,168,60,140,151,21,8,145,209,23,166,141,252,17,82,27,200,233,94,117,112,162,28,140,80,132,2,187,85,173,133,159,147,170,57,121,147,126,50,212,40,232,222,149,230,45,182,189,229,68,77,170,248,177,73,153,73,5,29,145,96,87,187,248,117,174,91,158,27,60,214,156,156,204,105,152,78,48,11,205,95,65,153,55,24,240,140,244,129,239,129,186,241,147,111,95,230,161,233,195,233,58,254,177,103,181,131,38,0,34,42,221,0,188,68,127,149,106,212,175,65,250,1,27,160,215,219,146,21,17,160,14,180,123,0,139,40,204,208,57,156,25,0,0,0,14,116,97,98,108,101,95,116,121,112,101,95,102,102,116,0,0,0,68,63,116,37,210,253,76,32,248,133,76,106,55,99,0,186,166,64,161,224,103,116,243,36,14,192,52,171,131,82,66,69,23,205,165,255,221,186,49,91,154,219,187,239,250,167,188,231,226,165,182,205,152,18,217,194,73,34,84,19,232,23,92,120,35,171,73,53,239,10,84,101,236,233,79,221,189,165,238,217,83,133,204,64,11,147,57,181,49,209,233,131,151,72,93,22,95,105,191,200,234,228,134,1,88,67,90,59,122,180,103,227,142,117,219,244,74,46,175,72,243,107,8,4,9,23,253,11,30,9,65,220,138,211,68,65,254,65,110,185,15,251,44,89,41,114,31,219,135,104,236,29,7,167,75,129,182,21,11,54,14,5,85,165,176,204,200,24,38,18,235,163,3,128,43,49,207,115,148,59,177,216,143,98,154,87,24,204,202,109,82,167,3,192,213,215,183,17,132,170,172,72,233,77,89,144,167,114,91,145,188,40,8,153,1,37,115,176,241,231,28,77,114,214,71,67,50,29,198,190,54,102,39,124,56,6,20,120,171,92,80,169,22,160,12,102,182,78,190,42,153,191,249,249,187,36,56,184,66,193,149,167,74,69,247,188,20,52,224,121,241,129,159,220,171,203,143,248,240,89,107,251,237,218,245,7,106,152,93,242,152,35,85,154,200,97,85,225,160,177,239,135,168,180,216,78,49,142,47,64,212,142,26,255,51,156,14,209,73,151,91,192,240,206,251,45,73,54,138,242,201,12,30,16,80,177,158,234,114,80,247,246,212,102,123,174,144,158,64,239,138,118,10,202,42,165,28,188,246,253,242,204,200,137,138,154,77,249,118,214,237,182,64,8,40,125,212,20,17,232,144,114,250,251,61,204,93,251,43,5,240,202,228,207,97,104,101,72,187,30,56,31,86,177,120,255,29,124,173,190,105,51,201,33,177,50,27,42,10,217,157,41,89,39,147,85,168,142,36,238,247,220,159,18,20,243,248,18,33,215,216,180,150,46,244,234,51,189,73,62,172,118,161,155,232,78,153,95,187,89,103,110,218,84,91,57,243,112,184,251,113,37,254,114,36,225,84,94,206,46,45,212,112,1,100,40,149,24,30,171,184,29,235,145,98,188,237,167,55,177,149,126,228,235,116,226,130,4,41,37,206,3,76,237,228,239,46,103,198,242,90,78,127,211,255,12,66,168,140,109,34,82,35,25,51,108,28,150,250,76,237,178,241,246,59,86,43,61,35,169,2,122,68,203,59,177,76,6,131,45,170,28,110,91,244,245,221,25,224,44,207,105,113,109,227,125,69,68,168,167,167,198,31,1,67,45,46,15,34,178,173,147,41,32,125,66,64,50,200,16,137,48,172,224,186,63,149,57,42,203,140,183,63,165,145,247,231,42,137,222,12,68,206,119,22,182,65,22,91,241,11,228,243,107,103,179,147,241,157,80,80,213,132,80,26,58,98,165,117,101,156,125,92,220,165,160,102,29,155,127,73,104,2,183,195,111,14,174,41,30,130,173,75,232,76,151,56,185,133,70,179,72,252,197,227,26,245,237,92,54,187,170,26,158,155,37,21,222,49,218,163,196,233,91,64,246,211,184,236,30,11,138,74,37,171,3,94,147,169,168,197,46,147,52,102,215,134,61,226,96,22,2,94,225,9,163,16,8,168,153,193,54,102,122,109,233,192,24,249,77,62,201,2,0,135,161,81,125,117,173,71,116,234,206,17,185,103,49,67,220,230,86,10,143,116,56,188,225,29,119,75,146,204,252,57,79,65,20,200,219,178,248,114,127,64,236,3,4,179,232,35,8,134,26,98,123,82,152,210,211,46,87,139,108,119,14,35,238,210,214,228,240,250,176,196,24,159,153,212,247,165,96,23,112,151,96,50,50,198,80,181,141,107,33,4,79,89,64,229,193,223,79,44,98,50,20,111,214,243,23,160,178,216,193,57,164,110,247,45,107,44,44,27,127,51,39,23,166,41,41,220,88,35,247,92,46,149,187,38,50,243,195,225,113,36,138,82,26,71,5,233,171,168,98,55,141,29,193,76,230,138,118,201,224,109,60,231,232,177,247,162,51,29,127,53,58,236,197,55,219,114,177,186,20,176,59,250,222,55,48,73,188,68,219,163,0,210,66,198,114,163,248,234,172,40,170,75,179,138,202,65,255,6,123,4,43,10,17,44,136,172,240,127,71,255,73,120,217,61,192,151,5,255,162,143,189,193,202,199,205,23,58,93,44,127,176,62,199,169,141,112,81,21,90,220,240,97,104,210,174,111,28,46,129,207,1,12,54,92,25,183,165,132,226,54,171,136,85,66,114,61,53,217,71,92,236,165,102,230,33,129,255,39,111,171,236,196,193,52,215,91,162,217,188,156,181,88,229,238,22,108,141,50,184,141,67,191,133,71,124,27,59,251,134,243,52,248,231,24,79,65,21,2,53,226,212,123,86,23,133,148,102,43,105,205,15,196,91,111,171,159,151,247,232,133,15,113,168,21,149,174,139,154,6,22,0,171,111,51,108,82,53,92,213,150,159,137,132,208,192,166,81,142,43,91,16,160,101,24,162,192,78,145,100,84,65,186,154,167,4,197,66,65,123,215,116,159,223,25,210,44,18,182,232,121,25,193,173,126,174,79,234,192,157,173,192,54,138,3,193,91,150,89,62,81,91,199,148,50,59,90,177,137,212,162,123,179,163,187,186,124,36,105,136,184,197,193,74,49,248,36,31,105,77,226,203,74,118,0,197,227,63,101,139,68,221,141,180,87,162,186,84,135,247,126,107,22,41,36,172,197,122,24,97,235,152,192,185,46,71,242,52,195,11,160,74,180,235,120,181,209,181,194,243,20,254,221,12,143,145,102,210,62,70,0,148,83,175,184,164,50,144,114,32,93,217,200,24,209,176,151,142,146,228,50,150,0,21,159,3,75,160,172,81,175,125,138,237,205,186,109,232,22,168,71,196,205,118,40,157,92,243,129,161,130,48,41,31,211,0,21,194,17,158,119,73,49,248,175,54,193,88,129,111,21,128,91,48,124,142,195,232,162,95,38,86,109,125,43,236,84,67,2,248,58,32,113,59,178,233,211,43,20,73,181,198,95,20,132,68,65,142,149,78,124,34,181,22,15,182,150,46,76,238,149,134,151,49,173,219,159,202,107,182,243,204,13,245,84,46,57,125,36,29,17,28,10,44,244,81,120,97,112,72,144,13,55,148,244,219,248,66,174,100,139,71,224,226,241,111,80,200,44,1,175,236,46,250,87,113,122,246,25,4,38,31,217,90,139,187,13,170,201,134,94,46,227,220,190,118,55,208,9,252,112,128,114,11,238,105,102,187,157,53,198,86,51,162,220,148,52,116,120,189,1,144,184,29,45,69,8,235,111,5,19,232,144,246,60,188,170,232,174,154,175,30,183,111,253,92,171,155,207,25,55,133,162,232,118,115,129,55,46,67,180,66,75,39,95,12,1,195,235,4,231,45,0,175,152,31,251,62,64,210,97,30,45,121,124,85,78,133,136,57,91,198,150,136,22,202,48,129,46,222,188,63,116,167,216,59,193,75,198,11,99,14,98,117,236,139,142,63,46,221,197,148,81,111,12,26,37,4,33,127,125,26,154,166,121,2,136,192,151,111,128,92,227,88,203,243,100,26,27,93,138,225,57,23,222,201,161,99,29,85,70,197,91,103,127,91,200,78,36,121,171,247,108,129,106,193,160,250,243,27,55,244,91,241,18,153,210,198,50,172,44,111,2,187,14,183,60,80,239,137,12,210,142,180,126,138,205,156,21,71,122,230,90,193,82,191,18,55,119,171,145,217,80,172,126,63,188,68,78,137,199,49,157,39,126,38,78,33,177,83,51,10,227,96,39,132,171,107,26,10,147,255,17,240,82,154,156,107,240,90,48,8,214,89,193,90,216,231,141,122,216,28,22,143,78,56,239,93,181,121,152,39,66,195,48,102,60,62,133,246,219,229,48,208,119,152,149,89,94,149,30,72,6,121,67,110,138,110,36,11,117,230,62,99,63,199,248,238,84,126,143,253,190,11,81,233,29,135,144,123,45,16,238,145,48,130,216,110,50,180,92,157,240,104,117,62,125,7,187,135,56,100,0,223,248,208,152,101,185,233,180,190,145,173,167,23,198,102,192,10,68,7,71,101,60,92,159,245,169,1,177,51,7,176,34,172,178,139,147,146,9,190,52,94,250,208,44,189,30,58,166,31,120,83,10,25,159,250,44,242,13,45,207,101,42,60,96,16,68,168,179,137,231,37,146,16,240,133,7,146,90,182,58,183,36,14,197,39,229,170,59,46,194,235,232,128,32,92,21,120,242,185,227,145,248,95,165,10,250,127,232,105,74,70,100,169,41,70,70,125,180,175,52,86,83,1,9,132,61,59,22,173,198,52,155,104,38,221,142,146,147,46,116,235,31,112,30,85,173,129,117,44,189,252,62,74,6,192,115,169,2,1,231,253,81,117,89,0,206,241,121,234,196,229,247,105,168,189,101,245,138,169,190,49,1,212,193,138,36,145,74,199,71,166,192,104,108,136,166,15,163,220,210,247,208,161,228,151,132,242,243,148,159,127,230,163,218,175,45,75,166,73,214,193,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,116,97,98,108,101,95,116,121,112,101,95,108,97,103,114,97,110,103,101,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,0,0,0,4,105,100,95,49,0,0,0,16,9,7,189,101,40,63,65,146,149,170,131,124,180,174,156,183,142,32,255,187,69,201,142,223,19,137,178,68,252,230,236,4,34,221,0,60,165,210,133,75,74,43,118,44,190,216,0,150,242,207,10,5,236,224,49,185,178,137,155,194,57,198,121,38,167,161,2,121,178,29,243,136,91,113,202,119,138,187,66,190,152,204,14,16,4,142,248,245,101,19,156,48,60,0,25,42,201,147,11,92,21,176,251,189,120,88,176,143,82,252,183,58,35,230,115,38,241,214,185,149,54,105,124,79,183,194,215,46,201,242,155,176,250,97,96,194,32,131,106,192,75,224,143,140,247,77,166,113,47,124,235,204,69,101,149,83,255,233,138,3,4,112,174,36,231,51,60,125,172,204,148,169,15,13,114,34,110,6,117,195,9,231,26,239,36,67,56,174,132,114,162,50,75,32,170,204,216,194,157,134,144,175,230,21,247,90,116,77,107,47,141,129,139,228,194,111,5,22,211,42,118,180,201,7,111,37,122,73,95,188,35,100,173,76,168,21,24,33,174,119,122,152,72,158,129,181,210,170,51,183,173,235,219,73,174,7,241,248,66,250,95,255,114,214,2,178,35,169,152,223,43,87,66,205,248,58,115,148,143,206,241,181,35,116,82,66,185,24,211,34,255,115,255,159,196,201,119,254,145,152,36,44,196,175,12,100,102,106,60,32,91,91,130,148,66,144,214,218,54,5,84,94,253,214,105,22,163,35,206,91,150,39,11,187,185,120,149,121,106,104,107,21,118,112,201,203,107,105,133,119,241,35,50,108,244,243,6,132,154,238,176,116,176,15,67,122,68,252,10,96,5,82,126,204,180,208,248,117,139,74,10,181,50,31,49,13,100,175,141,220,83,166,119,217,60,101,1,174,56,130,217,159,81,133,137,225,50,225,191,217,64,101,79,63,27,26,247,143,81,43,53,0,90,47,125,0,204,245,133,105,138,20,192,63,4,181,101,188,83,119,10,156,207,235,60,5,104,27,175,223,85,147,175,123,22,226,7,173,192,15,86,51,84,193,101,190,106,117,45,121,91,62,0,41,3,142,216,116,220,21,139,218,133,22,41,130,144,4,235,15,255,15,53,109,26,151,86,85,175,88,55,168,75,3,210,135,40,205,114,223,247,21,0,0,0,8,105,100,95,49,95,102,102,116,0,0,0,64,20,136,95,195,77,154,152,231,244,131,240,98,164,73,17,96,59,209,58,249,111,110,102,154,71,185,225,105,133,48,85,7,36,241,127,156,76,178,93,20,48,28,238,65,29,97,23,238,104,145,228,179,253,177,146,221,145,58,157,114,150,7,181,76,35,78,75,173,93,121,87,113,133,128,162,50,52,0,111,213,153,49,230,183,168,225,21,101,44,75,243,162,225,25,242,39,166,47,227,55,222,237,129,17,4,177,109,247,170,172,63,199,159,76,128,214,151,10,242,218,196,87,99,50,132,18,128,74,118,0,75,181,244,117,243,74,143,162,129,199,65,249,117,100,122,96,56,198,95,234,204,226,21,214,144,76,78,188,7,73,86,109,200,191,18,116,126,165,195,131,16,225,165,132,39,201,20,42,227,186,143,57,153,24,117,17,11,224,5,175,75,77,100,89,108,119,82,87,6,171,131,208,113,210,197,135,84,160,190,13,232,176,240,239,235,176,88,170,215,25,153,177,39,70,166,215,54,166,200,138,82,86,42,37,82,204,174,120,121,89,214,93,244,253,225,213,47,133,230,195,58,219,80,222,11,17,226,38,25,235,150,98,20,3,194,160,142,67,30,155,223,234,75,233,28,222,51,244,31,249,159,227,116,111,177,36,5,48,117,227,125,188,245,40,234,48,46,171,83,97,76,216,151,12,230,67,255,36,80,99,245,65,180,183,201,179,218,145,63,31,92,219,45,62,33,247,248,4,103,188,109,163,62,128,6,144,114,180,101,45,88,27,19,205,45,41,227,128,88,144,203,73,97,228,166,109,41,222,9,23,34,236,148,21,229,165,172,114,19,127,137,148,225,54,113,155,178,135,19,103,25,232,233,44,41,149,136,198,110,64,47,81,78,17,31,96,24,237,229,77,205,173,227,73,72,95,202,139,22,156,211,11,228,62,1,7,166,174,237,232,117,238,234,14,241,143,248,2,156,224,7,138,229,189,57,217,179,35,204,121,248,115,3,155,247,215,94,2,128,129,78,120,59,0,3,57,224,135,76,109,84,53,137,221,46,182,145,236,111,114,200,198,253,194,18,163,203,142,249,53,30,235,15,132,226,233,51,83,168,250,73,74,13,142,118,39,121,106,162,211,148,74,139,65,59,230,101,90,177,180,197,20,57,245,27,47,43,180,114,226,23,105,12,150,200,212,9,196,167,135,213,40,242,133,111,171,138,221,73,143,97,8,243,15,27,218,236,114,20,246,210,170,7,130,234,129,97,160,145,134,113,202,43,88,124,155,214,4,48,168,172,37,182,185,252,67,18,241,101,34,238,56,34,203,96,188,121,83,178,241,69,210,169,15,31,116,249,79,60,115,147,128,43,224,127,67,91,56,11,215,6,13,173,23,9,170,25,253,90,14,223,38,140,251,18,110,217,99,145,114,6,71,15,229,202,14,26,128,55,83,172,6,96,138,0,182,139,73,81,43,61,251,86,15,32,94,169,94,20,157,16,101,251,66,165,233,218,231,54,247,211,94,158,122,25,234,41,158,192,254,161,0,205,212,88,230,210,115,228,197,75,250,227,120,232,224,251,226,152,195,185,86,179,36,63,166,13,130,28,142,218,111,95,99,181,237,40,219,118,148,253,175,160,206,78,9,150,226,106,65,113,168,47,47,33,95,243,29,221,65,103,159,209,170,32,73,61,68,140,150,125,73,181,5,156,151,251,17,15,103,27,66,57,145,15,232,1,23,43,21,48,88,94,255,108,30,231,12,154,11,99,53,82,105,143,102,85,67,177,194,163,254,61,34,63,105,137,216,208,75,211,240,142,243,200,51,79,192,32,179,156,115,0,87,202,94,40,176,160,11,29,80,97,13,46,71,68,236,251,200,20,16,83,98,14,103,32,92,228,213,210,210,136,81,102,71,253,229,122,48,255,217,134,52,182,223,115,106,253,212,70,69,154,30,239,183,97,224,42,64,41,173,183,105,101,8,33,243,35,95,97,11,79,236,29,219,131,59,13,166,214,251,165,242,233,88,88,162,210,239,243,2,56,99,191,65,135,76,227,192,74,71,126,188,24,205,255,146,214,222,194,151,245,212,116,253,1,17,255,241,27,151,12,165,156,38,104,198,115,234,115,60,34,50,23,232,4,240,139,207,85,69,31,67,150,118,162,83,232,11,75,123,116,125,4,124,237,67,59,125,139,197,230,165,24,55,5,199,131,230,188,247,177,145,142,174,120,138,135,158,202,14,3,130,164,143,55,146,31,71,234,94,211,130,145,219,0,251,160,245,192,23,121,156,70,64,221,236,161,48,228,200,166,92,56,113,165,161,43,80,182,174,242,160,226,244,12,221,103,120,171,211,187,91,176,238,230,176,66,51,96,255,243,55,119,85,28,69,44,119,239,241,2,61,70,2,59,112,252,123,221,191,245,246,115,46,15,219,181,162,190,31,162,104,247,53,202,67,105,178,77,244,235,69,15,210,102,133,157,172,107,87,68,251,181,124,227,214,44,40,46,92,0,237,183,172,239,42,246,74,148,88,43,187,166,137,194,17,62,240,92,191,66,8,214,224,85,101,221,0,3,61,176,117,107,245,91,163,125,102,188,94,96,41,196,189,84,0,230,219,158,199,46,73,110,186,6,234,78,231,34,209,27,157,74,149,100,157,28,138,86,179,95,83,254,208,104,123,164,227,215,90,150,33,62,219,241,252,208,166,44,233,148,210,216,41,156,69,17,11,143,66,13,91,24,10,222,19,255,86,176,108,202,104,57,99,34,11,117,36,59,238,239,219,163,230,32,169,9,150,235,87,161,158,148,72,119,86,54,29,147,77,69,183,28,146,70,208,22,223,136,68,205,35,196,239,166,165,214,57,60,51,79,197,83,57,252,138,197,23,170,115,37,144,70,33,162,244,138,237,247,3,149,93,108,166,225,37,221,89,82,108,8,124,196,27,180,224,178,138,46,62,167,67,64,21,43,250,198,176,251,192,203,236,67,160,198,148,153,92,59,96,28,108,5,172,103,151,199,73,114,104,33,24,176,6,172,201,253,251,255,252,115,96,171,175,54,212,89,90,224,184,227,212,195,31,40,102,91,130,168,152,23,107,99,49,97,92,174,238,1,107,152,171,3,143,251,193,133,205,26,122,82,209,84,201,13,174,142,96,98,56,202,220,57,249,227,89,243,16,2,131,66,254,131,12,40,151,196,242,99,95,215,230,13,27,190,164,181,250,199,232,73,118,173,28,170,171,27,49,190,52,31,145,38,165,80,239,73,120,155,213,165,22,76,90,242,106,156,19,27,159,197,198,252,129,27,46,236,156,64,59,190,0,127,200,10,71,207,124,142,212,34,123,71,55,120,225,56,186,37,87,41,209,198,65,78,239,43,63,156,10,164,23,100,167,17,113,170,78,201,195,214,100,240,196,73,110,51,172,179,136,99,186,252,190,49,7,59,249,101,52,202,99,41,15,187,44,102,175,15,60,157,3,19,235,104,243,251,142,72,190,90,40,10,79,209,85,54,174,64,56,45,9,4,170,145,25,35,185,40,65,153,219,44,252,243,135,29,42,161,131,33,41,254,114,145,218,63,138,189,202,206,156,139,175,228,128,150,30,44,149,86,3,41,251,146,75,131,8,148,207,50,132,192,82,77,124,162,237,186,15,231,77,234,117,33,22,224,140,139,28,37,163,140,101,209,16,125,159,170,132,11,111,255,128,209,109,30,244,203,142,4,205,93,17,70,30,61,41,253,54,170,36,220,6,56,55,93,29,26,88,214,39,231,248,82,77,194,176,239,211,53,251,210,140,214,230,45,144,171,243,253,177,1,57,154,122,84,12,241,97,118,110,74,193,47,112,52,51,83,170,128,244,94,115,196,60,77,89,145,217,37,40,183,104,91,21,65,196,149,167,236,176,28,230,2,206,73,41,248,152,134,91,39,201,144,222,191,149,35,234,65,72,249,184,89,24,242,8,237,224,141,148,117,191,144,8,160,110,65,205,189,116,130,17,65,192,70,133,9,68,59,3,218,232,246,46,88,201,228,30,59,151,93,69,36,233,187,18,246,20,129,187,45,81,108,237,183,53,198,128,91,105,33,156,66,237,60,6,32,135,118,57,195,190,149,157,7,125,235,67,231,129,6,27,136,165,213,178,122,43,70,25,184,70,207,181,71,147,115,55,127,128,72,60,199,200,163,214,63,63,104,21,43,109,152,243,62,203,183,243,83,34,62,158,199,242,145,30,147,96,251,239,195,211,113,77,161,108,148,252,199,154,119,146,17,212,53,155,120,74,220,142,34,51,155,148,91,20,76,47,16,156,118,236,111,128,183,30,156,142,120,145,100,121,138,51,165,225,167,207,91,72,204,224,163,142,187,35,240,195,189,211,45,235,57,237,40,44,235,93,125,199,99,46,31,155,249,225,154,240,164,125,157,137,254,166,194,12,205,58,115,20,85,125,41,56,173,185,43,207,182,65,101,7,158,152,142,3,74,183,250,75,187,38,81,8,147,206,20,250,252,253,88,176,21,28,211,1,43,179,159,179,238,68,163,0,232,109,244,27,55,249,220,106,127,101,148,193,220,105,78,239,246,200,97,136,96,194,162,192,35,144,91,214,55,86,0,0,0,13,105,100,95,49,95,108,97,103,114,97,110,103,101,0,0,0,16,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,63,124,173,181,226,74,173,248,190,133,203,131,255,198,96,45,247,41,148,93,43,253,118,217,169,217,154,63,231,124,64,36,144,91,22,233,35,165,66,128,163,160,79,122,152,64,38,139,249,155,234,222,60,223,198,73,165,161,46,60,158,210,57,44,139,239,220,158,151,61,117,127,32,145,71,177,44,23,63,95,110,108,9,116,121,98,177,141,207,8,193,57,53,123,55,43,179,119,61,61,116,15,34,195,70,230,39,157,139,31,56,121,127,7,5,86,32,110,130,34,32,252,197,166,23,202,133,4,102,97,93,18,182,41,218,17,149,177,137,83,162,178,105,176,36,122,39,209,214,61,210,122,210,142,116,174,19,49,187,29,243,73,45,74,12,78,178,19,218,57,121,196,248,86,103,167,33,109,75,175,2,133,234,104,203,254,40,144,106,60,137,37,7,0,0,144,11,183,45,219,248,19,18,84,251,89,107,25,140,106,137,138,253,231,49,10,36,97,91,40,36,37,190,82,255,112,208,107,171,109,13,147,85,120,162,143,180,162,76,232,79,89,7,231,125,206,186,227,84,3,173,239,147,115,76,74,195,131,82,42,69,160,22,143,99,91,167,111,145,9,7,35,195,134,110,165,65,142,41,151,169,102,200,130,254,31,136,60,114,164,233,246,3,70,129,7,127,64,35,121,248,143,65,197,192,20,24,36,48,172,217,38,174,158,52,134,71,202,142,52,119,16,35,65,144,173,78,8,2,80,43,66,100,185,40,241,75,68,249,142,243,40,239,226,131,55,162,136,176,33,145,53,79,136,194,162,179,219,161,196,219,250,74,86,5,177,47,215,58,169,253,172,76,29,30,78,51,68,157,27,206,210,66,92,156,158,162,205,113,193,233,117,141,47,233,159,238,29,254,159,149,54,219,49,150,77,206,245,128,177,238,19,210,107,13,67,15,182,210,149,27,157,17,116,72,167,249,46,152,121,0,169,152,67,183,83,106,6,182,7,136,65,58,50,123,96,63,59,0,0,0,4,105,100,95,50,0,0,0,16,150,136,10,163,222,108,153,106,77,191,132,249,117,179,6,195,158,0,91,65,159,222,23,187,73,81,115,145,154,85,160,18,195,5,58,235,8,47,24,191,209,33,158,142,56,19,55,229,139,78,194,243,136,238,182,241,2,183,244,10,51,129,145,11,252,136,136,214,164,229,149,223,72,173,12,186,59,145,1,161,242,217,74,74,233,46,6,54,181,98,167,185,215,115,249,21,167,247,62,69,129,188,109,76,131,213,131,115,32,132,139,69,36,69,34,2,211,81,37,104,255,234,65,158,160,138,140,36,164,244,231,105,31,132,201,121,207,100,183,115,152,6,238,47,213,57,20,198,83,71,115,48,169,59,121,181,234,62,240,17,248,81,145,85,96,152,70,19,152,157,72,81,64,73,140,39,204,145,83,241,22,135,138,225,170,64,70,168,35,118,15,16,62,112,37,155,145,193,147,80,29,23,101,146,35,87,246,85,137,199,7,193,156,28,22,24,82,194,245,43,203,175,170,5,196,131,140,84,133,162,161,211,126,236,85,29,209,181,1,65,245,83,72,217,45,165,193,87,131,174,197,25,192,87,172,11,214,172,238,45,113,176,212,196,207,116,178,192,223,113,190,108,32,103,14,158,241,218,48,107,79,31,100,134,161,235,22,21,105,9,183,147,31,3,240,7,99,10,197,196,175,155,89,121,146,166,52,162,126,182,5,166,135,66,68,157,36,176,254,28,139,65,126,40,136,132,130,126,57,103,81,93,192,125,150,36,147,65,186,66,65,141,157,71,147,10,252,190,22,79,55,13,153,23,178,249,53,165,65,200,10,34,92,98,113,80,19,61,65,151,239,177,118,197,220,149,205,145,215,161,176,199,217,11,242,213,30,165,184,73,140,222,53,72,132,197,162,164,180,240,37,15,133,93,136,138,228,25,17,148,18,245,190,28,33,39,195,158,125,187,4,58,160,132,3,56,56,120,195,88,209,140,252,215,19,211,14,5,226,134,183,33,168,177,76,175,148,13,60,197,211,85,213,201,53,149,241,68,246,207,40,130,165,12,78,117,116,51,239,108,150,34,143,112,152,60,185,219,136,7,254,108,130,76,235,230,114,159,21,253,60,0,46,70,199,140,95,128,168,117,245,206,220,26,3,21,132,104,212,242,181,36,0,0,0,8,105,100,95,50,95,102,102,116,0,0,0,64,239,128,183,10,174,227,207,142,102,224,145,118,238,35,197,15,75,98,54,44,43,124,121,174,53,54,131,218,19,32,255,18,255,44,136,245,67,32,219,34,245,214,233,183,5,230,162,141,208,158,1,37,188,188,35,77,16,92,157,142,32,163,194,29,161,104,30,132,47,252,123,62,97,22,53,97,138,106,134,7,164,114,17,57,61,104,80,251,177,240,188,235,196,88,175,94,229,140,21,110,54,94,177,176,26,170,50,213,254,1,96,180,252,87,133,87,253,210,105,64,62,33,195,171,232,232,71,41,64,106,130,113,173,107,77,51,16,140,128,195,5,227,118,236,5,33,55,192,92,215,145,61,171,207,40,197,38,16,60,92,55,245,130,115,242,120,72,253,72,190,2,34,121,30,100,0,231,72,187,234,61,7,14,214,1,148,249,115,254,102,26,70,168,83,18,151,26,188,84,66,158,93,197,179,252,166,28,202,2,215,125,133,217,51,39,240,52,202,224,241,132,20,208,50,103,17,107,211,5,32,41,66,164,45,12,40,77,223,116,143,176,220,167,214,111,191,149,99,150,124,34,20,70,115,106,72,221,93,201,140,209,80,20,21,216,123,24,151,197,35,138,169,153,90,58,170,95,196,200,19,101,17,100,81,153,211,133,12,150,183,28,85,92,188,146,50,124,185,103,46,170,112,2,162,182,48,161,149,107,3,184,224,21,176,127,201,220,232,224,3,247,199,184,83,111,157,165,125,180,106,167,4,105,101,86,22,22,188,178,4,210,41,93,48,194,46,238,237,213,199,131,91,115,151,33,212,202,223,90,2,230,109,135,39,243,76,227,184,136,145,225,194,204,233,172,77,148,125,24,129,217,128,166,54,29,224,244,174,232,76,87,236,220,240,80,158,215,72,198,241,81,247,194,34,159,7,3,208,240,126,54,164,129,12,204,36,28,217,99,12,3,197,219,85,174,144,92,40,69,233,38,79,240,79,22,214,186,68,21,39,199,60,152,212,141,26,36,88,149,126,21,97,70,102,132,246,245,60,83,179,94,55,15,3,250,166,135,239,41,158,217,203,77,171,184,187,32,150,69,81,117,4,105,202,226,134,137,8,215,68,15,153,97,5,34,66,67,39,135,216,98,50,123,241,219,224,96,47,235,193,170,89,100,252,59,198,226,183,153,169,229,19,219,100,27,131,63,149,159,154,77,12,58,155,247,246,56,180,237,214,33,107,97,40,96,130,55,42,171,177,23,147,178,192,117,46,136,56,121,49,3,123,104,24,235,112,164,215,4,44,78,136,251,189,166,46,233,4,161,216,137,155,34,207,165,158,227,249,30,146,140,89,114,157,150,190,79,42,139,240,47,13,19,207,31,188,84,76,132,139,30,69,43,57,181,219,69,175,60,233,160,95,160,185,238,177,255,27,217,183,68,46,9,26,113,99,75,169,251,24,68,171,43,155,31,156,61,217,92,68,153,111,113,45,152,214,79,46,107,4,102,44,102,110,109,115,71,117,210,142,91,10,27,45,181,251,65,173,171,32,212,203,220,243,91,210,52,28,239,112,90,236,136,110,103,170,67,9,141,163,127,88,17,94,233,229,168,76,23,236,55,252,111,103,179,69,51,222,80,253,16,65,249,115,154,204,140,166,214,150,206,145,192,184,240,44,229,140,84,5,129,89,155,136,136,205,125,167,248,121,158,205,126,163,55,166,170,16,218,143,62,49,86,12,127,97,14,34,156,65,80,100,164,96,198,43,70,224,28,38,167,129,227,29,33,242,44,203,82,193,185,220,40,48,13,127,56,120,203,43,165,181,184,112,43,203,249,183,78,56,100,98,241,251,82,72,219,209,100,1,64,126,251,157,105,74,235,157,79,246,213,34,209,78,123,151,12,254,218,188,26,241,214,241,167,119,235,46,245,64,46,170,214,169,181,150,63,235,98,180,6,88,12,53,184,175,226,56,189,184,52,93,233,18,170,92,199,222,70,59,38,172,73,90,200,14,117,243,138,199,246,196,134,144,17,22,247,249,116,38,243,176,107,16,124,233,133,159,243,189,46,247,247,85,143,251,249,238,173,94,109,217,219,80,75,167,124,47,89,211,175,215,107,45,248,247,1,40,209,85,89,100,186,100,200,127,110,159,233,165,55,87,191,1,66,20,250,25,249,42,237,84,252,181,20,231,18,124,5,10,145,7,128,65,97,95,180,3,77,102,134,125,117,151,109,217,168,103,45,143,122,42,163,56,24,46,175,62,239,167,99,230,193,211,21,251,230,104,19,143,41,237,206,125,23,16,59,183,60,117,121,50,8,83,125,169,205,49,101,251,101,83,146,254,32,244,196,69,26,42,66,172,85,107,85,57,150,6,205,39,17,209,120,40,106,78,99,193,215,25,130,34,136,54,169,117,49,179,141,249,174,181,60,243,225,89,95,177,134,108,213,138,234,61,0,55,14,3,175,86,50,63,83,123,69,54,80,7,78,2,158,89,159,186,204,45,6,172,4,174,92,20,47,149,225,137,15,124,119,5,47,236,129,216,70,230,142,17,64,163,189,189,30,71,168,201,186,131,203,39,18,176,91,54,248,43,78,244,17,109,184,5,110,35,208,24,173,187,54,18,171,179,58,192,92,171,26,174,60,30,71,219,148,180,17,214,35,146,45,126,174,90,131,29,129,125,48,54,224,146,148,163,127,134,99,7,102,206,144,227,107,206,20,63,249,69,191,135,162,39,63,204,126,1,54,6,196,235,80,13,128,5,93,216,159,40,229,109,152,105,126,16,224,160,176,170,249,250,255,144,29,95,138,189,96,38,114,55,161,144,95,239,53,83,61,119,194,221,150,127,181,89,112,164,17,91,225,142,233,89,199,115,29,78,165,182,133,80,108,31,127,24,51,252,232,247,110,162,166,175,20,204,234,40,227,135,85,133,195,191,196,181,25,166,68,215,126,196,139,98,149,16,138,176,127,186,68,13,242,185,108,253,236,245,7,37,239,18,132,238,29,14,18,97,167,179,228,242,13,30,151,191,146,47,145,46,162,124,185,117,144,31,175,184,162,52,126,47,215,23,48,180,144,159,49,246,63,18,110,140,176,182,66,209,168,25,31,173,125,14,26,49,87,135,3,233,237,57,128,78,185,199,203,58,122,31,94,161,49,148,183,102,178,243,173,214,59,59,49,213,130,219,53,234,150,131,100,155,250,149,6,215,143,230,234,16,63,143,148,30,89,150,219,115,180,77,189,197,181,81,62,179,93,95,96,61,3,109,45,52,190,222,132,16,169,117,100,2,96,109,42,127,29,133,49,20,218,148,15,157,53,74,143,188,161,174,178,60,20,199,122,123,143,241,172,21,246,172,153,208,56,51,221,208,146,60,8,51,170,119,8,181,252,66,191,112,146,199,9,208,53,109,191,52,169,133,170,141,54,37,28,88,9,190,168,50,184,114,55,117,150,184,197,90,65,10,52,22,128,108,12,141,46,226,28,152,185,50,16,166,202,93,174,18,112,66,153,133,72,220,106,73,78,132,155,208,105,63,76,246,195,124,249,44,62,64,187,62,194,125,195,102,77,227,106,127,109,226,252,79,48,53,156,148,214,95,138,224,249,83,23,191,4,219,208,31,138,193,10,22,73,230,130,112,81,47,236,238,147,104,209,77,86,130,95,150,53,30,81,51,202,50,150,68,195,28,8,216,87,124,236,159,18,182,56,236,114,184,79,247,51,229,65,77,229,60,171,142,242,111,77,10,236,60,236,142,143,36,91,219,194,145,107,224,169,161,231,189,253,149,143,107,196,89,72,29,168,43,39,1,214,66,163,119,10,93,225,116,116,58,193,26,125,21,90,218,60,251,5,100,152,242,199,93,207,200,233,112,221,20,8,177,29,45,225,29,81,67,47,7,70,239,19,207,197,29,187,109,99,140,134,129,240,157,110,72,66,94,138,15,162,201,149,13,22,69,0,145,214,35,187,216,156,121,139,216,92,50,26,32,132,122,192,4,185,211,22,216,175,248,213,132,242,131,12,77,150,176,227,108,67,27,124,56,151,142,179,156,82,153,177,247,62,116,42,196,150,43,160,46,26,215,64,192,46,202,51,14,59,40,111,241,125,36,123,190,243,117,168,40,136,231,108,178,48,141,87,11,45,139,223,150,6,156,109,3,153,163,138,204,137,152,231,21,86,52,5,143,195,249,126,74,187,92,208,22,1,141,187,19,226,97,45,161,14,155,137,88,222,245,146,227,159,90,236,116,53,55,248,5,241,183,236,237,13,176,51,226,229,183,123,34,181,143,139,23,146,27,142,214,109,165,52,203,87,175,225,1,178,91,207,228,136,170,181,116,241,52,208,241,233,240,69,205,244,67,173,137,239,138,59,230,201,136,242,48,239,224,57,91,51,80,181,209,181,192,44,131,205,5,254,148,225,184,245,172,155,197,247,176,250,167,109,247,176,39,31,44,222,129,94,140,217,36,41,117,18,242,115,187,152,173,21,32,246,176,213,52,152,131,103,50,134,166,53,134,73,114,154,93,164,109,189,125,62,48,123,144,236,18,142,29,27,13,236,24,38,245,168,210,65,225,200,166,214,195,180,24,123,40,249,146,174,161,73,149,69,73,0,0,0,13,105,100,95,50,95,108,97,103,114,97,110,103,101,0,0,0,16,230,255,255,159,249,14,13,27,63,145,42,163,163,104,186,234,137,6,221,216,118,235,216,71,195,187,245,32,85,8,208,21,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,204,201,111,205,99,99,197,113,236,96,168,124,216,161,239,22,107,170,143,84,86,69,161,143,147,167,34,168,75,227,143,27,179,173,80,90,166,93,194,109,93,19,128,143,189,210,107,59,179,188,41,62,133,213,53,227,102,171,254,155,62,46,132,22,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,188,113,226,162,129,165,213,150,142,207,49,105,2,250,104,204,144,24,245,231,233,199,163,227,123,25,56,45,188,66,129,42,27,0,0,80,154,230,212,40,82,223,142,214,164,127,121,61,211,81,164,168,63,90,119,112,102,228,59,192,29,70,148,26,244,52,18,139,77,109,21,4,179,69,26,122,139,211,19,112,3,84,155,248,119,32,116,104,132,175,5,134,191,28,192,32,202,146,156,35,118,85,7,120,27,150,165,205,108,166,31,230,253,231,161,179,183,106,62,90,127,224,241,39,186,23,179,60,53,54,144,34,48,146,28,210,164,15,17,253,111,70,68,17,242,173,241,44,96,0,175,40,150,248,14,57,39,107,212,20,78,82,175,149,237,151,31,214,51,93,57,234,138,21,200,236,169,155,87,67,49,112,26,213,194,244,50,69,52,32,224,25,130,169,204,189,78,168,55,116,47,241,241,103,142,74,27,202,223,50,104,211,20,31,196,11,137,179,83,159,252,91,199,25,6,25,45,100,193,5,69,182,91,74,53,69,246,35,191,46,189,254,63,240,167,225,37,123,138,182,127,28,105,68,233,44,70,142,29,61,166,69,238,240,147,17,65,138,142,214,254,131,41,152,13,27,131,195,252,140,215,38,43,149,41,90,71,54,0,0,0,4,105,100,95,51,0,0,0,16,81,10,115,192,155,197,30,205,74,100,175,47,183,134,184,114,46,45,88,160,43,248,147,185,76,181,204,69,115,113,21,46,191,5,58,43,185,88,144,175,140,95,184,167,22,114,103,68,23,237,188,237,174,215,117,16,92,54,46,134,103,71,0,10,46,113,61,110,87,177,140,87,29,214,145,174,42,30,237,125,151,72,89,37,2,182,77,42,47,3,181,132,110,56,3,7,167,247,62,69,129,188,109,76,131,213,131,115,32,132,139,69,36,69,34,2,211,81,37,104,255,234,65,158,160,138,140,36,9,129,249,55,202,23,34,242,238,60,184,222,182,68,76,34,123,35,40,244,77,144,120,5,22,172,59,219,82,59,209,5,233,239,108,207,251,131,192,169,133,5,204,185,10,181,96,4,55,62,68,175,65,153,34,46,181,197,11,59,31,200,80,35,126,83,147,128,131,74,165,72,93,226,41,173,71,146,111,170,99,172,214,129,107,113,7,205,12,246,109,40,136,37,40,26,196,131,140,84,133,162,161,211,126,236,85,29,209,181,1,65,245,83,72,217,45,165,193,87,131,174,197,25,192,87,172,11,103,207,132,109,157,162,107,171,66,15,177,155,151,192,115,122,71,157,42,10,151,197,93,245,86,210,7,65,17,11,161,15,105,9,183,147,31,3,240,7,99,10,197,196,175,155,89,121,146,166,52,162,126,182,5,166,135,66,68,157,36,176,254,28,13,181,202,51,236,109,111,189,244,254,162,87,216,206,67,138,55,112,146,156,246,1,173,202,14,83,241,132,55,79,46,6,153,23,178,249,53,165,65,200,10,34,92,98,113,80,19,61,65,151,239,177,118,197,220,149,205,145,215,161,176,199,217,11,65,165,14,122,36,107,23,29,166,48,90,73,139,68,239,64,201,194,87,100,92,61,54,188,153,12,83,96,14,229,64,29,209,0,162,81,213,88,68,170,132,95,251,149,176,4,201,135,52,211,161,147,45,173,249,129,131,252,176,61,222,14,239,9,72,134,100,205,204,139,64,230,33,185,90,198,253,104,147,117,42,243,190,61,82,28,78,246,222,83,29,175,68,161,10,9,254,108,130,76,235,230,114,159,21,253,60,0,46,70,199,140,95,128,168,117,245,206,220,26,3,21,132,104,212,242,181,36,0,0,0,8,105,100,95,51,95,102,102,116,0,0,0,64,34,213,255,253,215,182,91,175,210,248,73,143,209,241,197,211,193,112,239,120,44,52,149,137,121,214,24,2,2,160,234,51,149,25,37,47,203,115,187,150,255,227,46,204,155,171,7,95,140,49,188,252,1,16,101,151,50,197,242,86,0,117,203,17,77,171,238,173,77,163,124,18,108,187,248,66,50,68,85,131,74,139,41,190,206,26,202,178,179,246,194,41,28,158,43,16,183,150,102,246,45,138,206,11,128,2,216,233,218,31,66,53,23,29,228,218,41,137,242,24,228,6,187,78,192,146,182,95,149,162,152,71,251,72,205,26,214,151,119,146,234,140,160,84,132,53,159,20,124,155,53,110,112,140,18,205,189,232,20,76,62,215,140,142,19,230,147,1,36,154,129,187,120,192,208,135,71,127,153,97,208,41,224,249,190,250,181,6,59,103,130,27,90,6,55,238,124,42,164,174,222,66,157,91,107,76,141,133,45,22,48,200,180,138,26,249,165,162,58,178,241,149,128,5,232,214,194,154,17,67,185,244,144,231,109,128,121,56,11,97,178,215,101,73,179,123,35,185,167,157,134,123,29,152,176,3,65,208,233,150,18,22,196,228,193,157,60,31,216,248,152,118,89,98,85,247,59,42,239,89,59,15,61,153,140,116,57,45,49,215,229,40,194,63,59,28,17,29,189,148,253,25,15,219,193,162,51,93,29,124,207,184,160,39,16,123,172,89,27,94,159,98,160,202,62,133,39,79,252,114,0,246,14,105,110,67,63,60,105,58,87,55,21,231,123,7,81,220,56,53,186,37,71,164,197,113,74,1,110,246,186,217,61,93,210,18,70,138,17,160,212,151,171,11,119,206,24,14,198,35,17,19,153,0,42,213,48,28,16,102,107,167,41,38,87,165,21,198,9,57,231,64,74,63,98,0,69,133,66,57,156,28,209,22,87,35,19,124,99,147,93,237,103,141,191,247,126,216,88,29,227,200,193,135,229,225,246,215,218,176,191,76,96,77,98,26,66,64,178,107,27,45,203,79,244,9,207,210,168,2,209,9,63,227,57,216,244,69,156,245,157,229,90,177,134,49,147,72,147,94,25,121,42,49,11,144,147,149,166,124,42,2,51,240,222,200,76,71,213,62,244,249,187,138,71,208,6,65,153,155,21,45,239,144,3,187,135,161,37,114,45,91,83,213,35,227,241,44,188,63,49,206,55,119,65,143,138,209,150,219,21,3,25,9,165,134,71,13,78,240,160,23,160,135,180,208,221,129,190,206,234,212,80,181,102,93,102,227,50,205,21,159,186,157,231,18,239,183,52,92,179,159,227,76,153,31,232,55,107,144,37,51,25,124,44,163,53,251,47,187,211,71,83,66,6,57,230,44,82,205,98,2,214,199,227,207,87,46,254,41,7,117,71,82,214,192,2,165,183,203,124,237,197,209,8,87,137,211,248,69,167,191,144,185,127,197,196,180,93,45,101,126,96,190,244,210,121,48,229,115,146,245,218,67,164,221,244,158,39,63,196,51,46,68,241,115,60,39,92,190,174,142,147,205,181,14,228,6,1,213,88,201,83,134,58,120,121,252,105,115,207,6,42,68,193,37,1,66,184,127,125,20,127,17,106,72,124,55,67,249,79,122,204,102,64,163,42,172,141,186,228,44,29,116,155,0,45,80,146,140,34,55,133,173,21,12,227,211,17,152,176,103,251,129,159,92,105,127,94,25,186,155,61,194,26,188,217,29,18,89,171,43,9,6,26,73,155,3,17,8,225,29,237,98,96,115,78,185,173,236,137,99,213,208,151,189,248,241,59,76,70,67,80,89,96,65,180,247,180,84,173,5,109,76,138,84,142,68,49,96,81,196,231,138,244,90,5,21,116,16,245,82,140,221,182,243,36,4,100,148,178,138,140,231,173,153,161,62,30,116,163,125,177,44,225,239,43,27,219,99,178,63,132,51,34,32,225,94,42,188,59,220,104,129,30,190,192,50,184,130,206,179,176,15,168,153,77,115,7,182,15,63,219,183,174,60,142,242,75,147,241,8,248,214,144,167,52,151,6,144,253,100,243,183,247,233,192,7,131,234,5,16,213,43,63,0,110,80,53,128,135,253,68,73,13,199,242,70,155,166,33,138,39,159,18,183,104,46,57,93,248,222,176,178,50,68,76,2,2,46,150,19,76,139,223,163,217,157,227,120,193,151,252,160,243,122,84,113,74,10,77,90,8,158,220,235,82,1,184,125,53,54,222,213,222,214,119,237,71,97,164,248,178,92,236,75,231,253,138,238,60,54,101,95,119,82,123,62,242,190,74,18,239,81,178,206,181,154,48,234,11,65,52,248,124,111,59,64,140,64,158,86,39,171,47,165,242,53,200,58,156,219,239,187,220,30,75,142,29,114,70,251,226,176,87,16,123,231,212,24,238,152,96,26,208,117,160,227,211,236,135,135,100,86,123,245,53,83,165,247,21,120,116,3,67,173,142,234,99,183,184,33,138,77,112,8,86,204,147,198,44,247,16,55,32,65,194,233,156,23,21,209,36,192,8,170,223,45,120,224,21,29,49,79,219,221,73,213,44,102,1,225,227,103,11,77,110,167,72,38,184,30,211,154,193,28,2,146,52,48,44,190,59,103,18,181,28,154,3,38,71,202,169,109,215,175,11,248,79,173,98,252,79,41,4,17,18,225,124,39,235,182,125,60,203,22,23,65,79,211,150,174,176,11,225,30,179,148,125,127,99,4,123,68,95,82,162,168,141,181,218,161,122,91,244,45,60,3,113,156,163,96,58,200,41,2,245,211,72,164,195,60,85,29,103,220,135,15,70,197,47,118,186,67,98,244,85,2,37,22,112,118,80,139,208,24,196,153,27,220,71,79,66,189,12,12,212,116,177,40,179,25,252,214,135,157,251,65,187,157,140,95,190,12,131,30,239,158,123,42,93,66,200,72,88,105,98,75,42,54,155,2,103,130,57,206,163,193,13,43,13,213,238,157,255,120,199,134,47,37,126,61,1,23,97,69,95,128,113,219,194,77,93,78,225,7,41,58,65,137,69,167,25,77,21,151,121,161,48,196,188,144,92,185,150,11,188,170,50,90,233,59,202,89,146,26,37,113,189,98,42,94,1,237,235,103,112,25,142,102,177,156,100,1,94,18,166,214,83,254,69,142,182,190,44,103,27,6,166,10,206,254,15,153,251,114,15,126,139,1,38,178,167,125,14,112,169,179,124,105,227,62,89,169,197,26,15,216,238,36,255,0,138,99,101,161,16,42,242,41,31,73,65,236,148,53,9,218,51,171,66,154,174,169,198,22,76,77,14,207,11,91,212,222,114,26,105,107,227,92,90,236,60,139,167,233,106,251,250,78,219,95,35,25,82,46,100,83,78,12,30,172,26,33,11,109,157,131,32,13,133,45,130,107,136,22,253,206,73,202,149,23,45,181,112,101,66,180,94,215,161,166,135,168,195,75,127,41,39,229,112,185,21,197,54,107,10,154,85,132,136,200,129,66,236,47,70,143,134,170,121,165,120,147,140,30,69,23,195,96,79,240,126,99,50,25,107,231,254,22,78,84,141,80,155,95,191,24,87,124,247,188,244,208,208,221,110,75,232,5,215,35,105,221,33,80,222,253,58,47,161,236,177,64,141,223,111,121,4,107,100,147,223,146,227,188,131,159,188,224,245,65,180,207,129,14,0,51,204,104,207,137,23,187,252,57,155,213,109,158,234,208,158,30,178,59,227,175,162,130,15,208,201,83,41,179,224,42,97,228,131,38,64,174,41,42,87,57,164,247,178,234,212,185,176,242,113,78,112,112,206,25,247,33,229,4,100,118,59,36,59,63,20,167,183,8,155,149,156,10,134,122,192,218,90,226,77,2,155,151,175,72,79,118,217,4,96,66,165,89,158,247,167,201,38,22,198,56,100,170,182,173,182,87,142,195,159,194,158,227,72,26,232,248,108,148,91,19,162,86,185,54,245,178,144,189,174,67,155,212,176,126,243,170,237,225,179,179,253,0,31,16,19,248,244,150,55,80,221,167,239,40,248,46,238,122,204,121,104,63,238,141,155,228,205,143,73,127,186,69,15,225,75,169,46,159,96,104,86,125,177,84,21,91,182,36,175,44,121,216,63,80,214,51,40,99,202,7,225,55,29,161,229,200,80,23,251,187,159,36,78,29,5,236,60,16,82,111,138,88,166,172,163,69,115,65,23,144,89,194,107,79,216,4,27,107,193,65,5,222,34,158,81,193,132,70,112,21,10,125,122,147,51,113,255,71,165,242,159,179,19,187,148,247,195,29,133,181,96,143,169,34,19,56,181,37,81,197,4,62,58,82,186,194,90,157,93,227,208,66,2,65,176,220,99,213,71,239,147,61,68,61,122,155,137,85,28,90,224,114,73,80,29,180,247,174,221,5,80,61,57,82,72,173,37,220,170,76,206,15,163,50,173,188,235,56,95,237,204,90,86,182,176,87,122,226,68,198,229,163,189,53,90,239,148,108,197,154,25,209,38,158,106,233,89,135,17,187,131,67,61,64,56,87,127,62,144,14,193,156,185,151,51,89,115,72,249,199,34,233,57,136,153,154,21,116,188,124,37,225,254,128,17,5,211,251,201,9,0,0,0,13,105,100,95,51,95,108,97,103,114,97,110,103,101,0,0,0,16,225,255,255,239,21,67,163,199,104,94,139,66,57,223,182,33,184,76,86,81,230,142,71,174,242,154,253,186,22,128,218,35,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,91,37,134,198,243,18,38,174,254,144,62,125,40,250,225,121,7,238,248,177,220,222,23,33,15,169,31,3,119,103,101,23,61,157,45,9,170,165,85,169,236,51,14,199,161,1,119,114,196,208,177,48,72,242,150,184,12,20,142,244,0,91,87,17,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,198,255,255,159,123,92,206,158,22,127,252,107,148,95,61,228,228,250,177,168,166,52,208,61,140,182,193,250,248,57,70,9,174,187,15,253,249,253,165,102,215,152,241,179,178,104,156,75,85,45,191,21,54,7,62,148,29,120,47,220,179,48,166,31,33,0,0,240,17,168,32,192,185,130,231,176,87,241,176,46,2,100,172,177,134,252,88,194,96,165,101,7,207,28,238,60,242,165,226,6,101,229,64,83,119,77,3,144,247,141,44,48,246,84,33,94,63,169,222,147,175,18,129,148,224,65,168,58,139,22,239,109,147,10,90,127,92,16,218,73,109,223,190,184,6,190,13,86,140,109,199,128,213,6,87,232,210,154,114,24,166,218,121,41,160,226,187,149,146,223,122,252,31,238,81,174,85,106,136,207,217,102,56,151,26,247,17,222,251,230,254,24,196,98,210,230,233,79,140,154,164,60,171,178,166,230,188,181,152,135,207,80,110,83,185,255,28,140,163,236,113,243,12,31,208,49,143,112,110,142,247,244,121,123,131,68,75,19,23,121,189,131,228,254,170,246,145,161,146,87,191,217,87,224,165,69,161,183,207,65,159,209,76,232,87,9,101,107,156,89,137,166,245,220,153,160,135,233,163,184,225,199,60,79,200,97,146,63,84,68,240,226,45,237,29,33,75,72,129,63,222,103,203,4,101,131,67,237,54,132,98,220,53,200,51,230,49,108,34,65,0,0,0,4,105,100,95,52,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219,255,255,79,158,129,87,48,1,187,50,104,134,109,127,48,137,58,78,72,159,236,101,92,248,217,211,115,101,169,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,240,147,245,225,67,145,112,185,121,72,232,51,40,93,88,129,129,182,69,80,184,41,160,49,225,114,78,100,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,105,100,95,52,95,102,102,116,0,0,0,64,71,255,255,143,23,136,181,241,5,167,253,8,160,35,125,242,173,36,135,105,28,159,253,205,217,65,35,67,251,78,131,7,2,93,154,102,198,161,219,84,71,245,123,124,140,164,209,251,233,17,138,244,207,75,189,6,217,97,118,148,162,74,48,43,141,113,239,24,99,32,129,112,131,150,79,14,200,174,198,187,196,103,13,121,246,177,88,13,123,130,49,210,95,221,159,22,65,194,17,224,192,221,54,103,202,117,28,67,104,217,130,77,198,0,131,231,216,96,84,114,252,109,39,46,189,48,16,24,89,141,128,226,196,206,211,54,241,74,231,9,154,192,120,184,185,109,71,187,72,121,100,190,49,84,208,187,1,191,180,12,15,29,228,31,47,5,61,54,17,52,5,235,70,40,0,197,5,56,245,185,48,112,241,224,59,203,123,49,241,17,218,45,37,101,14,144,234,222,182,221,121,184,129,142,112,31,2,192,235,29,177,219,53,14,88,103,172,9,37,179,157,144,166,35,58,35,217,121,208,64,76,188,173,26,248,82,5,7,103,103,61,17,179,75,139,14,219,79,252,192,4,61,108,103,125,27,131,252,183,118,248,75,190,26,91,218,253,167,146,157,245,30,85,195,30,164,100,136,29,3,252,125,33,211,242,27,161,10,202,37,178,130,118,95,102,21,186,154,80,161,66,153,31,171,150,183,178,114,78,104,137,251,67,138,57,68,166,218,158,30,147,30,121,165,98,28,188,47,105,122,40,127,217,202,241,30,215,151,88,134,49,103,198,161,90,91,153,75,182,95,112,48,245,180,225,172,188,66,106,99,236,244,25,97,52,57,21,16,199,176,76,152,194,42,65,253,110,229,128,241,150,32,67,40,145,132,14,206,254,214,191,80,195,84,110,251,17,180,241,39,214,159,105,203,56,20,120,196,139,180,93,245,184,75,194,47,10,164,206,59,226,15,214,108,95,80,95,137,106,211,69,123,124,56,172,118,232,3,49,42,89,109,175,227,233,209,126,26,15,66,46,155,22,182,147,91,95,32,31,100,139,118,60,147,148,5,62,156,79,91,169,152,199,7,11,168,80,21,116,48,230,45,42,254,45,82,54,17,5,7,80,240,181,83,134,123,53,248,108,235,40,92,139,195,231,109,247,56,215,250,28,26,226,191,52,168,208,174,170,52,218,53,84,127,85,10,87,39,207,31,160,46,129,5,136,13,83,207,97,160,93,88,112,12,136,181,75,36,109,73,47,48,96,250,21,135,63,14,183,225,30,68,83,218,156,90,52,78,140,57,134,226,96,93,44,33,12,226,60,249,92,175,217,182,55,0,101,154,61,176,164,28,24,132,228,217,172,205,219,129,60,68,190,109,217,41,212,41,103,26,254,19,254,210,234,147,127,14,142,241,36,38,102,168,83,253,151,9,21,37,203,142,219,205,51,7,22,20,213,45,118,93,103,143,40,60,2,226,248,41,72,15,61,151,16,26,86,253,43,62,72,61,228,142,231,151,124,41,227,181,29,13,41,10,2,65,118,221,96,76,208,167,121,41,14,39,207,85,104,53,202,194,227,181,228,147,199,177,251,37,155,69,94,44,164,196,172,54,9,42,154,214,88,241,231,20,50,246,24,49,8,120,33,152,255,119,2,234,105,10,132,48,5,49,16,20,111,119,245,139,247,118,105,194,164,74,238,167,92,222,97,1,109,4,3,170,167,162,171,12,150,149,19,77,44,28,174,27,221,80,196,210,193,142,74,223,118,11,157,111,63,94,49,210,95,115,201,248,101,188,40,172,90,99,221,96,68,70,93,24,140,178,63,0,88,181,131,138,84,160,245,239,249,166,34,131,6,146,124,139,219,66,23,239,68,189,63,193,198,10,46,13,60,215,19,142,170,164,78,255,101,21,136,134,127,82,66,162,182,20,25,174,39,231,11,12,240,251,157,16,237,194,207,39,4,148,57,145,6,26,158,254,240,74,87,75,101,221,113,138,193,88,224,7,227,128,119,171,62,61,140,133,127,37,142,47,30,28,49,212,19,197,139,136,126,9,4,6,94,100,167,165,198,153,171,78,30,213,152,231,104,241,94,245,115,252,46,7,139,234,70,127,44,162,136,40,72,123,177,184,119,175,249,219,76,108,9,161,151,31,238,138,119,181,203,147,71,182,219,14,135,154,166,203,230,251,214,199,24,37,157,209,108,0,254,175,29,173,82,132,112,200,72,87,46,94,62,200,102,83,194,11,253,133,240,112,234,61,148,117,220,121,94,187,59,230,250,130,40,93,245,47,234,150,165,181,71,86,143,247,11,79,144,18,187,0,0,80,16,99,14,150,28,58,117,234,240,172,234,93,12,140,123,153,80,236,162,162,121,254,63,127,234,77,69,89,0,163,101,121,97,73,232,50,219,235,246,118,4,44,150,84,208,158,120,14,157,63,227,105,122,222,236,45,67,82,152,53,117,142,16,199,196,202,66,23,159,74,35,229,200,33,161,148,245,72,245,137,118,217,71,99,216,189,49,240,133,191,40,74,193,61,238,255,102,13,141,32,88,107,86,176,40,247,228,2,244,175,127,27,148,42,76,254,86,210,59,148,40,108,184,72,169,114,127,253,98,28,240,80,49,150,139,233,246,15,239,151,0,67,187,71,36,18,60,178,33,236,146,6,228,221,19,84,243,226,27,192,248,229,134,81,17,173,109,8,74,168,103,139,180,120,13,73,60,27,175,143,23,117,231,144,244,138,238,50,221,154,241,79,61,12,13,170,168,40,241,100,32,177,101,144,206,146,81,39,55,125,72,9,167,54,62,15,72,12,34,61,200,220,38,102,87,170,119,203,116,198,122,160,139,201,0,233,124,159,79,183,225,124,197,32,87,127,94,133,121,53,75,69,127,3,72,105,47,159,5,109,199,6,117,75,254,50,114,49,101,237,227,94,8,3,131,109,87,194,65,239,242,128,39,86,56,218,77,93,177,139,93,114,104,70,34,82,78,55,72,165,35,249,79,144,30,35,23,117,15,182,41,126,63,194,41,66,111,225,134,58,197,206,7,88,185,102,74,116,183,5,118,49,227,24,170,124,59,36,218,206,248,228,201,118,47,61,88,48,13,75,30,51,107,168,89,36,54,236,88,146,92,151,82,64,243,255,181,106,170,96,95,115,228,90,226,208,78,124,133,56,113,123,241,17,41,20,4,55,95,140,4,248,126,28,118,40,228,16,153,55,52,119,40,172,199,139,5,205,44,81,6,49,248,91,49,164,69,219,237,26,195,144,19,106,38,253,33,213,61,120,86,140,132,135,111,70,250,210,179,222,251,202,73,70,243,189,209,68,17,53,48,44,195,192,83,143,5,90,43,189,37,171,196,102,29,48,247,215,139,56,88,26,149,135,84,48,28,210,213,225,249,152,141,118,29,218,34,3,219,124,225,212,132,184,149,23,68,47,21,173,107,210,107,137,14,162,171,70,32,64,203,55,87,60,25,83,72,171,30,116,59,198,16,41,235,144,98,212,235,133,24,99,0,113,1,34,136,68,88,84,122,74,180,187,186,161,148,87,194,230,92,108,81,194,176,110,155,108,175,40,208,48,108,34,199,6,221,223,132,63,156,63,246,29,195,230,202,59,234,208,234,224,13,89,83,32,195,51,162,44,30,41,192,189,196,238,22,252,164,84,12,115,244,54,155,229,1,204,41,24,217,243,162,210,228,1,108,170,1,168,102,179,106,249,87,102,213,225,119,114,47,187,207,136,243,50,140,162,152,80,255,174,193,165,41,183,42,228,83,57,87,54,100,179,214,196,36,78,188,225,107,168,230,152,2,231,170,83,217,245,253,158,177,13,99,59,82,57,249,201,130,169,152,250,81,123,56,64,137,213,187,220,139,142,103,156,74,87,106,52,94,59,83,169,30,193,41,177,201,239,138,222,94,218,78,31,178,56,225,106,109,19,158,134,233,53,223,145,224,107,184,76,147,136,10,84,48,116,90,197,125,150,132,75,52,242,5,79,77,172,255,88,197,232,244,99,189,170,79,117,185,128,26,69,37,175,59,13,102,92,121,168,171,213,213,131,81,114,54,126,90,61,57,10,7,207,119,196,248,220,133,97,161,86,107,72,118,77,192,223,207,53,64,253,205,64,125,3,151,41,69,205,179,30,134,119,145,72,137,129,14,131,35,1,31,146,154,83,198,40,236,81,125,70,117,136,188,203,234,108,17,126,37,174,3,156,233,84,69,164,148,100,99,68,197,177,248,217,248,56,254,107,198,78,33,209,37,137,49,150,27,168,43,243,245,197,248,87,34,251,137,10,41,197,20,3,215,60,102,119,58,49,228,227,206,11,20,38,56,255,163,215,110,237,50,108,192,170,243,22,87,180,78,182,7,137,234,78,4,205,113,160,153,89,119,21,185,96,251,72,59,95,218,101,193,58,25,33,110,116,109,68,249,97,213,107,178,229,219,138,151,46,158,230,236,81,123,101,89,20,65,239,236,191,9,188,213,33,36,208,105,160,156,3,176,126,252,194,87,25,37,226,36,250,126,73,6,85,5,122,15,111,61,173,47,18,70,103,20,56,85,234,108,205,145,83,13,211,130,244,250,186,11,234,211,202,217,77,56,78,0,0,0,13,105,100,95,52,95,108,97,103,114,97,110,103,101,0,0,0,16,219,255,255,79,158,129,87,48,1,187,50,104,134,109,127,48,137,58,78,72,159,236,101,92,248,217,211,115,101,169,128,1,18,233,76,93,171,141,87,229,230,139,134,77,45,136,34,96,209,90,91,63,102,89,87,177,120,202,102,31,228,53,56,12,180,101,190,71,79,64,83,121,98,117,241,57,146,231,161,116,240,107,134,7,159,143,175,88,212,210,67,87,20,226,205,11,234,128,156,191,131,194,134,234,16,193,212,125,120,82,212,220,163,49,98,15,99,120,142,178,138,170,28,94,162,235,58,19,199,140,10,184,173,237,232,228,123,84,156,254,133,48,130,169,213,228,57,35,11,15,248,141,178,124,29,77,195,135,42,12,229,69,174,172,45,108,238,85,239,75,23,76,209,220,136,80,124,52,35,90,226,2,145,241,224,228,105,143,165,134,168,31,198,169,141,192,170,77,111,109,206,24,222,97,78,65,20,50,140,245,14,178,5,154,126,122,26,103,105,64,190,29,141,14,160,5,61,87,114,86,118,54,32,98,177,254,98,215,207,202,25,66,137,67,130,70,216,68,191,214,38,139,171,30,203,20,38,0,0,160,245,115,138,19,144,181,134,17,194,122,180,247,211,29,51,57,23,89,234,91,49,198,93,109,13,165,227,46,239,22,179,146,232,103,138,94,170,228,50,44,27,96,17,200,139,253,37,66,80,236,248,6,177,213,202,193,142,24,44,36,77,154,65,168,68,181,142,202,46,251,199,63,182,0,146,179,108,236,250,121,23,182,160,95,85,205,237,137,94,108,150,36,23,127,99,48,16,51,91,89,128,175,228,251,207,149,95,75,185,38,31,114,83,205,193,5,159,245,20,131,208,98,41,29,58,115,245,55,230,7,249,94,21,28,29,123,194,183,177,126,135,115,71,94,171,54,88,42,119,35,20,148,175,198,57,36,28,186,81,67,102,137,243,237,161,36,162,45,119,11,171,215,224,35,94,39,212,66,191,198,72,187,199,81,205,199,187,16,59,86,114,47,233,167,114,214,194,87,219,23,250,166,31,246,208,98,114,207,176,171,209,61,15,57,200,160,180,48,215,33,97,250,194,152,33,159,107,13,113,14,8,123,229,16,100,93,67,22,248,61,52,255,119,115,106,201,10,86,199,47,153,27,0,0,0,0,0,0,0,0,0,0,0,0,0],"verification_key":[0,0,0,2,0,0,0,16,0,0,0,0,0,0,0,23,0,0,0,4,73,68,95,49,20,49,49,179,12,40,156,67,239,232,192,60,207,165,125,56,234,109,137,210,58,227,28,229,113,75,197,218,168,106,118,142,13,192,44,120,142,211,61,165,182,104,114,235,249,88,92,141,122,188,18,1,205,106,171,211,81,16,126,56,63,147,205,25,0,0,0,4,73,68,95,50,16,10,73,113,157,83,107,100,184,223,158,5,39,248,52,205,186,193,200,45,174,64,92,152,107,137,91,238,31,26,95,127,23,203,156,211,170,18,143,125,129,57,31,10,14,41,78,37,236,111,70,47,21,23,211,58,187,241,102,166,83,8,0,217,0,0,0,4,73,68,95,51,43,202,144,96,224,0,83,238,84,20,36,120,164,118,157,225,218,57,5,32,64,106,223,171,38,240,66,41,186,158,47,146,26,64,232,125,119,70,91,3,93,140,174,66,227,136,72,159,215,222,73,255,126,254,118,41,247,125,250,215,95,10,80,132,0,0,0,4,73,68,95,52,46,234,100,140,135,50,89,107,19,20,254,42,77,47,5,54,63,12,153,78,145,206,202,210,88,53,51,142,222,226,41,79,10,180,152,134,194,185,75,208,189,63,110,209,219,190,44,178,103,29,42,229,29,49,193,33,4,51,195,151,43,182,69,120,0,0,0,3,81,95,49,17,6,177,58,190,50,155,216,217,204,157,44,38,98,209,188,147,72,214,64,225,47,196,203,134,200,239,193,35,83,200,124,0,151,151,74,98,154,19,122,227,132,196,28,91,51,187,224,199,208,219,86,44,248,10,45,0,91,175,105,0,76,80,224,0,0,0,3,81,95,50,11,179,73,194,52,84,255,76,100,220,198,200,195,79,126,184,253,168,129,202,234,240,9,67,198,81,215,253,244,134,246,229,9,112,67,97,123,110,149,178,1,76,151,252,222,99,33,165,184,102,181,73,19,200,56,79,46,254,157,40,209,127,48,75,0,0,0,3,81,95,51,10,205,230,201,195,86,211,30,31,11,118,99,63,185,237,42,175,255,250,203,54,114,46,10,202,57,105,201,0,17,21,133,29,33,237,17,42,61,17,54,236,88,93,39,202,111,155,250,58,42,154,151,126,214,164,84,166,202,180,8,55,94,142,190,0,0,0,3,81,95,52,2,214,253,158,132,219,231,75,117,49,225,128,20,5,161,194,146,17,123,26,23,254,254,157,224,191,217,237,241,168,75,249,41,60,106,179,192,106,6,105,175,19,57,58,130,198,10,69,154,59,42,11,118,141,164,90,199,175,127,42,236,64,252,66,0,0,0,12,81,95,65,82,73,84,72,77,69,84,73,67,21,117,73,158,206,175,178,185,32,253,18,117,203,174,240,27,101,142,44,200,94,145,166,118,174,247,207,210,94,132,179,216,19,205,139,201,233,65,52,30,115,10,15,92,236,197,65,191,84,239,217,8,59,22,154,67,4,24,116,58,219,123,89,226,0,0,0,5,81,95,65,85,88,21,90,15,81,254,199,140,51,255,206,183,54,77,105,215,172,39,229,112,174,80,188,24,5,9,118,78,179,254,249,72,21,28,28,71,32,190,212,74,89,29,151,203,199,43,110,68,182,68,153,151,19,168,211,198,110,144,84,170,87,38,50,76,118,0,0,0,3,81,95,67,29,39,169,134,181,204,152,42,167,195,70,120,27,109,4,246,159,247,84,178,54,108,25,0,203,224,231,232,76,172,239,237,23,87,44,72,240,224,111,147,47,192,204,255,209,89,200,28,140,119,29,102,48,85,159,71,78,77,188,19,247,10,90,81,0,0,0,10,81,95,69,76,76,73,80,84,73,67,10,211,75,94,141,183,42,90,207,68,39,84,108,114,148,190,110,212,244,210,82,167,144,89,229,5,249,171,193,189,243,237,30,91,38,121,10,38,235,52,2,23,221,154,210,141,191,144,160,73,244,42,56,82,172,212,94,111,82,31,36,180,144,14,0,0,0,3,81,95,77,35,138,46,11,151,121,7,27,160,31,103,97,76,21,77,4,141,192,51,165,254,115,2,194,153,213,83,210,5,184,25,132,1,182,212,122,27,243,20,18,53,23,24,27,222,45,237,213,196,85,215,172,85,209,217,65,23,225,47,80,98,152,61,34,0,0,0,6,81,95,83,79,82,84,44,188,231,190,238,48,118,183,141,172,224,73,67,214,157,13,158,40,170,109,0,224,70,133,39,129,165,242,8,22,100,92,43,194,126,194,225,97,46,162,132,176,139,204,85,182,242,253,145,93,17,191,237,189,192,229,157,224,158,91,40,149,32,128,0,0,0,7,83,73,71,77,65,95,49,43,90,227,204,129,65,188,154,155,46,76,69,134,126,153,33,167,33,20,80,94,233,153,240,161,200,127,247,94,247,80,123,42,218,250,131,76,239,152,182,154,45,139,63,250,79,108,104,31,249,163,28,78,161,171,92,176,121,207,152,170,154,168,193,0,0,0,7,83,73,71,77,65,95,50,42,156,121,156,239,126,82,19,132,22,151,51,129,134,245,1,150,87,113,70,135,150,150,28,132,199,148,142,42,169,207,43,6,218,61,216,5,223,113,238,102,96,230,96,163,157,71,50,141,237,222,74,220,107,26,198,111,70,252,227,151,107,139,116,0,0,0,7,83,73,71,77,65,95,51,5,103,47,224,134,19,76,147,223,227,161,72,230,3,212,9,139,54,245,151,71,224,53,22,140,111,179,202,118,63,102,49,23,138,85,224,7,117,190,57,162,221,182,96,198,73,57,186,144,8,75,30,85,169,79,107,76,117,185,76,22,201,22,51,0,0,0,7,83,73,71,77,65,95,52,3,169,243,237,73,240,108,142,27,166,4,165,102,73,134,0,154,28,153,207,102,169,190,248,69,103,201,82,130,52,61,50,7,88,133,69,78,170,52,250,245,26,34,213,206,147,70,216,252,151,4,20,215,103,108,219,229,77,110,133,243,202,80,33,0,0,0,7,84,65,66,76,69,95,49,2,195,151,7,60,138,188,230,212,20,12,155,150,18,9,221,120,59,255,26,28,252,153,155,178,152,89,207,177,108,70,252,43,123,186,45,30,255,252,224,208,51,245,150,180,208,48,117,5,153,190,103,13,181,147,175,134,225,146,63,232,161,187,24,0,0,0,7,84,65,66,76,69,95,50,44,113,197,139,102,73,143,144,59,59,187,218,61,5,206,143,251,87,26,75,60,248,53,51,243,247,27,153,160,79,110,107,3,157,206,55,249,77,27,189,151,204,234,50,162,36,254,42,250,239,188,189,8,12,132,220,234,144,181,79,78,10,133,143,0,0,0,7,84,65,66,76,69,95,51,39,220,68,151,126,254,107,55,70,162,144,112,111,79,114,117,120,60,115,207,229,104,71,216,72,253,147,182,59,243,32,131,10,83,102,38,109,215,183,26,16,179,86,3,2,38,162,222,12,191,46,220,143,8,91,22,215,54,82,177,94,206,216,245,0,0,0,7,84,65,66,76,69,95,52,19,96,151,215,158,27,10,227,115,37,94,135,96,196,153,0,167,88,142,196,214,128,156,144,187,69,16,5,163,222,48,119,19,221,117,21,204,172,64,149,48,45,32,79,6,240,191,242,89,93,119,189,247,46,74,205,176,176,180,57,105,134,13,152,0,0,0,10,84,65,66,76,69,95,84,89,80,69,22,255,53,1,54,145,33,212,16,180,69,146,146,57,186,5,127,226,17,218,209,183,6,228,154,59,85,146,15,172,32,236,30,25,9,135,235,217,207,72,15,96,139,130,19,74,0,235,128,7,103,60,30,209,11,131,74,105,90,223,0,104,82,42,0,0,0,0,0]} \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Nargo.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Nargo.toml new file mode 100644 index 00000000000..e0b467ce5da --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Nargo.toml @@ -0,0 +1,5 @@ +[package] +authors = [""] +compiler_version = "0.1" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Prover.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/Prover.toml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/src/main.nr new file mode 100644 index 00000000000..1cab78ecb95 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_modulo/src/main.nr @@ -0,0 +1,28 @@ +// Tests a very simple program. +// +// The features being tested is modulo operations on brillig +fn main() { + assert(modulo(47, 3) == 2); + assert(modulo(2, 3) == 2); + assert(signed_modulo(5, 3) == 2); + assert(signed_modulo(2, 3) == 2); + + let minus_two: i4 = 14; + let minus_three: i4 = 13; + let minus_five: i4 = 11; + + // (5 / -3) * -3 + 2 = -1 * -3 + 2 = 3 + 2 = 5 + assert(signed_modulo(5, minus_three) == 2); + // (-5 / 3) * 3 - 2 = -1 * 3 - 2 = -3 - 2 = -5 + assert(signed_modulo(minus_five, 3) == minus_two); + // (-5 / -3) * -3 - 2 = 1 * -3 - 2 = -3 - 2 = -5 + assert(signed_modulo(minus_five, minus_three) == minus_two); +} + +unconstrained fn modulo(x: u32, y: u32) -> u32 { + x % y +} + +unconstrained fn signed_modulo(x: i4, y: i4) -> i4 { + x % y +} diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Nargo.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Nargo.toml new file mode 100644 index 00000000000..e0b467ce5da --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Nargo.toml @@ -0,0 +1,5 @@ +[package] +authors = [""] +compiler_version = "0.1" + +[dependencies] \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Prover.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Prover.toml new file mode 100644 index 00000000000..2b26a4ce471 --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/Prover.toml @@ -0,0 +1,2 @@ +x = "10" + diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/src/main.nr b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/src/main.nr new file mode 100644 index 00000000000..d3dad57456f --- /dev/null +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/brillig_oracle/src/main.nr @@ -0,0 +1,24 @@ +// Tests oracle usage in brillig/unconstrained functions +fn main(x: Field) { + // call through a brillig wrapper + oracle_print_array_wrapper([x, x]); + + // TODO(#1615) Nargo currently only supports resolving one foreign call + // oracle_print_wrapper(x); +} + +#[oracle(oracle_print_impl)] +unconstrained fn oracle_print(_x : Field) -> Field {} + +unconstrained fn oracle_print_wrapper(x: Field) { + oracle_print(x); +} + +#[oracle(oracle_print_array_impl)] +unconstrained fn oracle_print_array(_arr : [Field; 2]) -> Field {} + +unconstrained fn oracle_print_array_wrapper(arr: [Field; 2]) { + oracle_print_array(arr); +} + + diff --git a/crates/nargo_cli/tests/test_data_ssa_refactor/config.toml b/crates/nargo_cli/tests/test_data_ssa_refactor/config.toml index b3700b5690d..66525b5048d 100644 --- a/crates/nargo_cli/tests/test_data_ssa_refactor/config.toml +++ b/crates/nargo_cli/tests/test_data_ssa_refactor/config.toml @@ -2,4 +2,4 @@ exclude = [] # List of tests (as their directory name) expecting to fail: if the test pass, we report an error. -fail = [""] +fail = ["brillig_assert_fail"] diff --git a/crates/noirc_evaluator/src/brillig/artifact.rs b/crates/noirc_evaluator/src/brillig/artifact.rs deleted file mode 100644 index c3129f0390e..00000000000 --- a/crates/noirc_evaluator/src/brillig/artifact.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::ssa_refactor::ir::basic_block::BasicBlockId; -use acvm::acir::brillig_vm::Opcode as BrilligOpcode; -use std::collections::HashMap; - -/// Pointer to a unresolved Jump instruction in -/// the bytecode. -pub(crate) type JumpLabel = usize; - -/// Pointer to a position in the bytecode where a -/// particular basic block starts. -pub(crate) type BlockLabel = usize; - -#[derive(Default, Debug, Clone)] -/// Artifacts resulting from the compilation of a function into brillig byte code. -/// Currently it is just the brillig bytecode of the function. -pub(crate) struct BrilligArtifact { - pub(crate) byte_code: Vec, - /// The set of jumps that need to have their locations - /// resolved. - unresolved_jumps: Vec<(JumpLabel, BasicBlockId)>, - /// A map of the basic blocks to their positions - /// in the bytecode. - blocks: HashMap, -} - -impl BrilligArtifact { - /// Link some compiled brillig bytecode with its referenced artifacts. - pub(crate) fn link(&mut self, obj: &BrilligArtifact) -> Vec { - self.link_with(obj); - self.resolve_jumps(); - self.byte_code.clone() - } - - /// Link with a brillig artifact - fn link_with(&mut self, obj: &BrilligArtifact) { - let offset = self.code_len(); - for (jump_label, block_id) in &obj.unresolved_jumps { - self.unresolved_jumps.push((jump_label + offset, *block_id)); - } - - for (block_id, block_label) in &obj.blocks { - self.blocks.insert(*block_id, block_label + offset); - } - - self.byte_code.extend_from_slice(&obj.byte_code); - } - - /// Adds a unresolved jump to be fixed at the end of bytecode processing. - pub(crate) fn add_unresolved_jump(&mut self, destination: BasicBlockId) { - self.unresolved_jumps.push((self.code_len(), destination)); - } - - /// Adds a label in the bytecode to specify where this block's - /// opcodes will start. - pub(crate) fn add_block_label(&mut self, block: BasicBlockId) { - self.blocks.insert(block, self.code_len()); - } - - /// Number of the opcodes currently in the bytecode - pub(crate) fn code_len(&self) -> usize { - self.byte_code.len() - } - - /// Resolves all of the unresolved jumps in the program. - /// - /// Note: This should only be called once all blocks are processed. - fn resolve_jumps(&mut self) { - for (jump_label, block) in &self.unresolved_jumps { - let jump_instruction = self.byte_code[*jump_label].clone(); - - let actual_block_location = self.blocks[block]; - - match jump_instruction { - BrilligOpcode::Jump { location } => { - assert_eq!(location, 0, "location is not zero, which means that the jump label does not need resolving"); - - self.byte_code[*jump_label] = - BrilligOpcode::Jump { location: actual_block_location }; - } - BrilligOpcode::JumpIfNot { condition, location } => { - assert_eq!(location, 0, "location is not zero, which means that the jump label does not need resolving"); - - self.byte_code[*jump_label] = - BrilligOpcode::JumpIfNot { condition, location: actual_block_location }; - } - BrilligOpcode::JumpIf { condition, location } => { - assert_eq!(location, 0,"location is not zero, which means that the jump label does not need resolving"); - - self.byte_code[*jump_label] = - BrilligOpcode::JumpIf { condition, location: actual_block_location }; - } - _ => unreachable!( - "all jump labels should point to a jump instruction in the bytecode" - ), - } - } - } -} diff --git a/crates/noirc_evaluator/src/brillig/binary.rs b/crates/noirc_evaluator/src/brillig/binary.rs deleted file mode 100644 index 93b307e1b70..00000000000 --- a/crates/noirc_evaluator/src/brillig/binary.rs +++ /dev/null @@ -1,106 +0,0 @@ -use crate::ssa_refactor::ir::{ - instruction::BinaryOp, - types::{NumericType, Type}, -}; -use acvm::acir::brillig_vm::{BinaryFieldOp, BinaryIntOp}; - -/// Type to encapsulate the binary operation types in Brillig -pub(crate) enum BrilligBinaryOp { - Field { op: BinaryFieldOp }, - Integer { op: BinaryIntOp, bit_size: u32 }, -} - -impl BrilligBinaryOp { - /// Convert an SSA binary operation into: - /// - Brillig Binary Integer Op, if it is a integer type - /// - Brillig Binary Field Op, if it is a field type - pub(crate) fn convert_ssa_binary_op_to_brillig_binary_op( - ssa_op: BinaryOp, - typ: Type, - ) -> BrilligBinaryOp { - // First get the bit size and whether its a signed integer, if it is a numeric type - // if it is not,then we return None, indicating that - // it is a Field. - let bit_size_signedness = match typ { - Type::Numeric(numeric_type) => match numeric_type { - NumericType::Signed { bit_size } => Some((bit_size, true)), - NumericType::Unsigned { bit_size } => Some((bit_size, false)), - NumericType::NativeField => None, - }, - _ => unreachable!("only numeric types are allowed in binary operations. References are handled separately"), - }; - - fn binary_op_to_field_op(op: BinaryOp) -> BinaryFieldOp { - match op { - BinaryOp::Add => BinaryFieldOp::Add, - BinaryOp::Sub => BinaryFieldOp::Sub, - BinaryOp::Mul => BinaryFieldOp::Mul, - BinaryOp::Div => BinaryFieldOp::Div, - BinaryOp::Eq => BinaryFieldOp::Equals, - _ => unreachable!( - "Field type cannot be used with {op}. This should have been caught by the frontend" - ), - } - } - fn binary_op_to_int_op(op: BinaryOp, is_signed: bool) -> BinaryIntOp { - match op { - BinaryOp::Add => BinaryIntOp::Add, - BinaryOp::Sub => BinaryIntOp::Sub, - BinaryOp::Mul => BinaryIntOp::Mul, - BinaryOp::Div => { - if is_signed { - BinaryIntOp::SignedDiv - } else { - BinaryIntOp::UnsignedDiv - } - }, - BinaryOp::Mod => todo!("This is not supported by Brillig. It should either be added into Brillig or legalized by the SSA IR"), - BinaryOp::Eq => BinaryIntOp::Equals, - BinaryOp::Lt => BinaryIntOp::LessThan, - BinaryOp::And => BinaryIntOp::And, - BinaryOp::Or => BinaryIntOp::Or, - BinaryOp::Xor => BinaryIntOp::Xor, - BinaryOp::Shl => BinaryIntOp::Shl, - BinaryOp::Shr => BinaryIntOp::Shr, - } - } - // If bit size is available then it is a binary integer operation - match bit_size_signedness { - Some((bit_size, is_signed)) => { - let binary_int_op = binary_op_to_int_op(ssa_op, is_signed); - BrilligBinaryOp::Integer { op: binary_int_op, bit_size } - } - None => { - let binary_field_op = binary_op_to_field_op(ssa_op); - BrilligBinaryOp::Field { op: binary_field_op } - } - } - } -} - -/// Returns the type of the operation considering the types of the operands -/// TODO: SSA issues binary operations between fields and integers. -/// This probably should be explicitely casted in SSA to avoid having to coerce at this level. -pub(crate) fn type_of_binary_operation(lhs_type: Type, rhs_type: Type) -> Type { - match (lhs_type, rhs_type) { - // If either side is a Field constant then, we coerce into the type - // of the other operand - (Type::Numeric(NumericType::NativeField), typ) - | (typ, Type::Numeric(NumericType::NativeField)) => typ, - // If both sides are numeric type, then we expect their types to be - // the same. - (Type::Numeric(lhs_type), Type::Numeric(rhs_type)) => { - assert_eq!( - lhs_type, rhs_type, - "lhs and rhs types in a binary operation are always the same" - ); - Type::Numeric(lhs_type) - } - (lhs_type, rhs_type) => { - unreachable!( - "ICE: Binary operation between types {:?} and {:?} is not allowed", - lhs_type, rhs_type - ) - } - } -} diff --git a/crates/noirc_evaluator/src/brillig/brillig_gen.rs b/crates/noirc_evaluator/src/brillig/brillig_gen.rs index fde751b16c0..00d26f6c7fd 100644 --- a/crates/noirc_evaluator/src/brillig/brillig_gen.rs +++ b/crates/noirc_evaluator/src/brillig/brillig_gen.rs @@ -1,328 +1,39 @@ -use super::{ - artifact::BrilligArtifact, - binary::{type_of_binary_operation, BrilligBinaryOp}, - memory::BrilligMemory, -}; -use crate::ssa_refactor::ir::{ - basic_block::{BasicBlock, BasicBlockId}, - dfg::DataFlowGraph, - function::Function, - instruction::{Binary, Instruction, InstructionId, TerminatorInstruction}, - post_order::PostOrder, - types::Type, - value::{Value, ValueId}, -}; -use acvm::{ - acir::brillig_vm::{ - BinaryIntOp, Opcode as BrilligOpcode, RegisterIndex, Value as BrilligValue, - }, - FieldElement, -}; -use std::collections::HashMap; - -#[derive(Default)] -/// Generate the compilation artifacts for compiling a function into brillig bytecode. -pub(crate) struct BrilligGen { - obj: BrilligArtifact, - /// A usize indicating the latest un-used register. - latest_register: usize, - /// Map from SSA values to Register Indices. - ssa_value_to_register: HashMap, - /// Tracks memory allocations - memory: BrilligMemory, -} - -impl BrilligGen { - /// Adds a brillig instruction to the brillig byte code - fn push_code(&mut self, code: BrilligOpcode) { - self.obj.byte_code.push(code); - } - - /// Gets a `RegisterIndex` for a `ValueId`, if one already exists - /// or creates a new `RegisterIndex` using the latest available - /// free register. - fn get_or_create_register(&mut self, value: ValueId) -> RegisterIndex { - if let Some(register_index) = self.ssa_value_to_register.get(&value) { - return *register_index; - } +pub(crate) mod brillig_block; +pub(crate) mod brillig_fn; - let register = self.create_register(); - - // Cache the `ValueId` so that if we call it again, it will - // return the register that has just been created. - // - // WARNING: This assumes that a register has not been - // modified. If a MOV instruction has overwritten the value - // at a register, then this cache will be invalid. - self.ssa_value_to_register.insert(value, register); - - register - } - - /// Creates a new register. - fn create_register(&mut self) -> RegisterIndex { - let register = RegisterIndex::from(self.latest_register); - self.latest_register += 1; - register - } - - /// Converts an SSA Basic block into a sequence of Brillig opcodes - fn convert_block(&mut self, block_id: BasicBlockId, dfg: &DataFlowGraph) { - self.obj.add_block_label(block_id); - let block = &dfg[block_id]; - self.convert_block_params(block, dfg); - - for instruction_id in block.instructions() { - self.convert_ssa_instruction(*instruction_id, dfg); - } - - // Jump to the next block - let jump = block.terminator().expect("block is expected to be constructed"); - match jump { - TerminatorInstruction::JmpIf { condition, then_destination, else_destination } => { - let condition = self.convert_ssa_value(*condition, dfg); - self.jump_if(condition, *then_destination); - self.jump(*else_destination); - } - TerminatorInstruction::Jmp { destination, arguments } => { - let target = &dfg[*destination]; - for (src, dest) in arguments.iter().zip(target.parameters()) { - let destination = self.convert_ssa_value(*dest, dfg); - let source = self.convert_ssa_value(*src, dfg); - self.push_code(BrilligOpcode::Mov { destination, source }); - } - self.jump(*destination); - } - TerminatorInstruction::Return { return_values } => { - self.convert_ssa_return(return_values, dfg); - } - } - } - - /// Adds a unresolved `Jump` instruction to the bytecode. - fn jump(&mut self, target: BasicBlockId) { - self.obj.add_unresolved_jump(target); - self.push_code(BrilligOpcode::Jump { location: 0 }); - } - - /// Adds a unresolved `JumpIf` instruction to the bytecode. - fn jump_if(&mut self, condition: RegisterIndex, target: BasicBlockId) { - self.obj.add_unresolved_jump(target); - self.push_code(BrilligOpcode::JumpIf { condition, location: 0 }); - } - - /// Converts the SSA return instruction into the necessary BRillig return - /// opcode. - /// - /// For Brillig, the return is implicit; The caller will take `N` values from - /// the Register starting at register index 0. `N` indicates the number of - /// return values expected. - fn convert_ssa_return(&mut self, return_values: &[ValueId], dfg: &DataFlowGraph) { - for (destination_index, value_id) in return_values.iter().enumerate() { - let return_register = self.convert_ssa_value(*value_id, dfg); - if destination_index > self.latest_register { - self.latest_register = destination_index; - } - self.push_code(BrilligOpcode::Mov { - destination: destination_index.into(), - source: return_register, - }); - } - self.push_code(BrilligOpcode::Stop); - } +use crate::ssa_refactor::ir::{function::Function, post_order::PostOrder}; - /// Converts SSA Block parameters into Brillig Registers. - fn convert_block_params(&mut self, block: &BasicBlock, dfg: &DataFlowGraph) { - for param_id in block.parameters() { - let value = &dfg[*param_id]; - let param_type = match value { - Value::Param { typ, .. } => typ, - _ => unreachable!("ICE: Only Param type values should appear in block parameters"), - }; - match param_type { - Type::Numeric(_) => { - self.get_or_create_register(*param_id); - } - _ => { - todo!("ICE: Param type not supported") - } - } - } - } - - /// Converts an SSA instruction into a sequence of Brillig opcodes. - fn convert_ssa_instruction(&mut self, instruction_id: InstructionId, dfg: &DataFlowGraph) { - let instruction = &dfg[instruction_id]; - - match instruction { - Instruction::Binary(binary) => { - let result_ids = dfg.instruction_results(instruction_id); - let result_register = self.get_or_create_register(result_ids[0]); - self.convert_ssa_binary(binary, dfg, result_register); - } - Instruction::Allocate => { - let pointer_register = - self.get_or_create_register(dfg.instruction_results(instruction_id)[0]); - self.allocate_array(pointer_register, 1); - } - Instruction::Store { address, value } => { - let address_register = self.convert_ssa_value(*address, dfg); - let value_register = self.convert_ssa_value(*value, dfg); - self.push_code(BrilligOpcode::Store { - destination_pointer: address_register, - source: value_register, - }); - } - Instruction::Load { address } => { - let target_register = - self.get_or_create_register(dfg.instruction_results(instruction_id)[0]); - let address_register = self.convert_ssa_value(*address, dfg); - self.push_code(BrilligOpcode::Load { - destination: target_register, - source_pointer: address_register, - }); - } - Instruction::Not(value) => { - let result_ids = dfg.instruction_results(instruction_id); - let result_register = self.get_or_create_register(result_ids[0]); - - assert_eq!( - dfg.type_of_value(*value), - Type::bool(), - "not operator can only be applied to boolean values" - ); - - let one = self.make_constant(FieldElement::one()); - let condition = self.convert_ssa_value(*value, dfg); - - // Compile !x as (1 - x) - let opcode = BrilligOpcode::BinaryIntOp { - destination: result_register, - op: BinaryIntOp::Sub, - bit_size: 1, - lhs: one, - rhs: condition, - }; - self.push_code(opcode); - } - Instruction::Truncate { value, .. } => { - // Effectively a no-op because brillig already has implicit truncation on integer - // operations. We need only copy the value to it's destination. - let result_ids = dfg.instruction_results(instruction_id); - let destination = self.get_or_create_register(result_ids[0]); - let source = self.convert_ssa_value(*value, dfg); - self.push_code(BrilligOpcode::Mov { destination, source }); - } - _ => todo!("ICE: Instruction not supported {instruction:?}"), - }; - } - - fn allocate_array(&mut self, pointer_register: RegisterIndex, size: u32) { - let array_pointer = self.memory.allocate(size as usize); - self.push_code(BrilligOpcode::Const { - destination: pointer_register, - value: BrilligValue::from(array_pointer), - }); - } - - /// Returns a register which holds the value of a constant - fn make_constant(&mut self, constant: FieldElement) -> RegisterIndex { - let register = self.create_register(); - - let const_opcode = - BrilligOpcode::Const { destination: register, value: BrilligValue::from(constant) }; - self.push_code(const_opcode); - - register - } - - /// Converts the Binary instruction into a sequence of Brillig opcodes. - fn convert_ssa_binary( - &mut self, - binary: &Binary, - dfg: &DataFlowGraph, - result_register: RegisterIndex, - ) { - let binary_type = - type_of_binary_operation(dfg[binary.lhs].get_type(), dfg[binary.rhs].get_type()); - - let left = self.convert_ssa_value(binary.lhs, dfg); - let right = self.convert_ssa_value(binary.rhs, dfg); +use std::collections::HashMap; - let brillig_binary_op = BrilligBinaryOp::convert_ssa_binary_op_to_brillig_binary_op( - binary.operator, - binary_type, - ); - match brillig_binary_op { - BrilligBinaryOp::Field { op } => { - let opcode = BrilligOpcode::BinaryFieldOp { - op, - destination: result_register, - lhs: left, - rhs: right, - }; - self.push_code(opcode); - } - BrilligBinaryOp::Integer { op, bit_size } => { - let opcode = BrilligOpcode::BinaryIntOp { - op, - destination: result_register, - bit_size, - lhs: left, - rhs: right, - }; - self.push_code(opcode); - } - } - } +use self::{brillig_block::BrilligBlock, brillig_fn::FunctionContext}; - /// Converts an SSA `ValueId` into a `RegisterIndex`. - fn convert_ssa_value(&mut self, value_id: ValueId, dfg: &DataFlowGraph) -> RegisterIndex { - let value = &dfg[value_id]; +use super::brillig_ir::{artifact::BrilligArtifact, BrilligContext}; - let register = match value { - Value::Param { .. } | Value::Instruction { .. } => { - // All block parameters and instruction results should have already been - // converted to registers so we fetch from the cache. - self.get_or_create_register(value_id) - } - Value::NumericConstant { constant, .. } => { - let register_index = self.get_or_create_register(value_id); - self.push_code(BrilligOpcode::Const { - destination: register_index, - value: BrilligValue::from(*constant), - }); - register_index - } - _ => { - todo!("ICE: Should have been in cache {value:?}") - } - }; - register - } +/// Converting an SSA function into Brillig bytecode. +/// +/// TODO: Change this to use `dfg.basic_blocks_iter` which will return an +/// TODO iterator of all of the basic blocks. +/// TODO(Jake): what order is this ^ +pub(crate) fn convert_ssa_function(func: &Function) -> BrilligArtifact { + let mut reverse_post_order = Vec::new(); + reverse_post_order.extend_from_slice(PostOrder::with_function(func).as_slice()); + reverse_post_order.reverse(); - /// Compiles an SSA function into a Brillig artifact which - /// contains a sequence of SSA opcodes. - pub(crate) fn compile(func: &Function) -> BrilligArtifact { - let mut brillig = BrilligGen::default(); + let mut function_context = + FunctionContext { function_id: func.id(), ssa_value_to_register: HashMap::new() }; - brillig.convert_ssa_function(func); + let mut brillig_context = BrilligContext::new(); - brillig.obj + for block in reverse_post_order { + BrilligBlock::compile(&mut function_context, &mut brillig_context, block, &func.dfg); } - /// Converting an SSA function into Brillig bytecode. - /// - /// TODO: Change this to use `dfg.basic_blocks_iter` which will return an - /// TODO iterator of all of the basic blocks. - /// TODO(Jake): what order is this ^ - fn convert_ssa_function(&mut self, func: &Function) { - let mut reverse_post_order = Vec::new(); - reverse_post_order.extend_from_slice(PostOrder::with_function(func).as_slice()); - reverse_post_order.reverse(); + brillig_context.artifact() +} - for block in reverse_post_order { - self.convert_block(block, &func.dfg); - } - } +/// Creates an entry point artifact, that will be linked with the brillig functions being called +pub(crate) fn create_entry_point_function(num_arguments: usize) -> BrilligArtifact { + let mut brillig_context = BrilligContext::new(); + brillig_context.entry_point_instruction(num_arguments); + brillig_context.artifact() } diff --git a/crates/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs b/crates/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs new file mode 100644 index 00000000000..8d74b11332e --- /dev/null +++ b/crates/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs @@ -0,0 +1,511 @@ +use crate::brillig::brillig_ir::{ + BrilligBinaryOp, BrilligContext, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, +}; +use crate::ssa_refactor::ir::types::CompositeType; +use crate::ssa_refactor::ir::{ + basic_block::{BasicBlock, BasicBlockId}, + dfg::DataFlowGraph, + instruction::{Binary, BinaryOp, Instruction, InstructionId, TerminatorInstruction}, + types::{NumericType, Type}, + value::{Value, ValueId}, +}; +use acvm::acir::brillig_vm::{BinaryFieldOp, BinaryIntOp, RegisterIndex, RegisterValueOrArray}; +use acvm::FieldElement; +use iter_extended::vecmap; + +use super::brillig_fn::FunctionContext; + +/// Generate the compilation artifacts for compiling a function into brillig bytecode. +pub(crate) struct BrilligBlock<'block> { + function_context: &'block mut FunctionContext, + /// The basic block that is being converted + block_id: BasicBlockId, + /// Context for creating brillig opcodes + brillig_context: &'block mut BrilligContext, +} + +impl<'block> BrilligBlock<'block> { + /// Converts an SSA Basic block into a sequence of Brillig opcodes + pub(crate) fn compile( + function_context: &'block mut FunctionContext, + brillig_context: &'block mut BrilligContext, + block_id: BasicBlockId, + dfg: &DataFlowGraph, + ) { + let mut brillig_block = BrilligBlock { function_context, block_id, brillig_context }; + + brillig_block.convert_block(dfg); + } + + fn convert_block(&mut self, dfg: &DataFlowGraph) { + // Add a label for this block + let block_label = self.create_block_label(self.block_id); + self.brillig_context.enter_context(block_label); + + // Convert the block parameters + let block = &dfg[self.block_id]; + self.convert_block_params(block, dfg); + + // Convert all of the instructions into the block + for instruction_id in block.instructions() { + self.convert_ssa_instruction(*instruction_id, dfg); + } + + // Process the block's terminator instruction + let terminator_instruction = + block.terminator().expect("block is expected to be constructed"); + self.convert_ssa_terminator(terminator_instruction, dfg); + } + + /// Creates a unique global label for a block + fn create_block_label(&self, block_id: BasicBlockId) -> String { + format!("{}-{}", self.function_context.function_id, block_id) + } + + /// Converts an SSA terminator instruction into the necessary opcodes. + /// + /// TODO: document why the TerminatorInstruction::Return includes a stop instruction + /// TODO along with the `Self::compile` + fn convert_ssa_terminator( + &mut self, + terminator_instruction: &TerminatorInstruction, + dfg: &DataFlowGraph, + ) { + match terminator_instruction { + TerminatorInstruction::JmpIf { condition, then_destination, else_destination } => { + let condition = self.convert_ssa_value(*condition, dfg); + self.brillig_context + .jump_if_instruction(condition, self.create_block_label(*then_destination)); + self.brillig_context.jump_instruction(self.create_block_label(*else_destination)); + } + TerminatorInstruction::Jmp { destination, arguments } => { + let target = &dfg[*destination]; + for (src, dest) in arguments.iter().zip(target.parameters()) { + let destination = self.convert_ssa_value(*dest, dfg); + let source = self.convert_ssa_value(*src, dfg); + self.brillig_context.mov_instruction(destination, source); + } + self.brillig_context.jump_instruction(self.create_block_label(*destination)); + } + TerminatorInstruction::Return { return_values } => { + let return_registers: Vec<_> = return_values + .iter() + .map(|value_id| self.convert_ssa_value(*value_id, dfg)) + .collect(); + self.brillig_context.return_instruction(&return_registers); + } + } + } + + /// Converts SSA Block parameters into Brillig Registers. + fn convert_block_params(&mut self, block: &BasicBlock, dfg: &DataFlowGraph) { + for param_id in block.parameters() { + let value = &dfg[*param_id]; + let param_type = match value { + Value::Param { typ, .. } => typ, + _ => unreachable!("ICE: Only Param type values should appear in block parameters"), + }; + match param_type { + Type::Numeric(_) => { + self.function_context.get_or_create_register(self.brillig_context, *param_id); + } + Type::Array(_, size) => { + let pointer_register = self + .function_context + .get_or_create_register(self.brillig_context, *param_id); + self.brillig_context.allocate_fixed_length_array(pointer_register, *size); + } + _ => { + todo!("ICE: Param type not supported") + } + } + } + } + + /// Converts an SSA instruction into a sequence of Brillig opcodes. + fn convert_ssa_instruction(&mut self, instruction_id: InstructionId, dfg: &DataFlowGraph) { + let instruction = &dfg[instruction_id]; + + match instruction { + Instruction::Binary(binary) => { + let result_ids = dfg.instruction_results(instruction_id); + let result_register = self + .function_context + .get_or_create_register(self.brillig_context, result_ids[0]); + self.convert_ssa_binary(binary, dfg, result_register); + } + Instruction::Constrain(value) => { + let condition = self.convert_ssa_value(*value, dfg); + self.brillig_context.constrain_instruction(condition); + } + Instruction::Allocate => { + let value: crate::ssa_refactor::ir::map::Id = + dfg.instruction_results(instruction_id)[0]; + self.function_context.get_or_create_register(self.brillig_context, value); + } + Instruction::Store { address, value } => { + let target_register = self.convert_ssa_value(*address, dfg); + let source_register = self.convert_ssa_value(*value, dfg); + + self.brillig_context.mov_instruction(target_register, source_register); + } + Instruction::Load { address } => { + let target_register = self.function_context.get_or_create_register( + self.brillig_context, + dfg.instruction_results(instruction_id)[0], + ); + let source_register = self.convert_ssa_value(*address, dfg); + + self.brillig_context.mov_instruction(target_register, source_register); + } + Instruction::Not(value) => { + assert_eq!( + dfg.type_of_value(*value), + Type::bool(), + "not operator can only be applied to boolean values" + ); + let condition = self.convert_ssa_value(*value, dfg); + let result_ids = dfg.instruction_results(instruction_id); + let result_register = self + .function_context + .get_or_create_register(self.brillig_context, result_ids[0]); + + self.brillig_context.not_instruction(condition, result_register); + } + Instruction::Call { func, arguments } => match &dfg[*func] { + Value::ForeignFunction(func_name) => { + let result_ids = dfg.instruction_results(instruction_id); + + let input_registers = vecmap(arguments, |value_id| { + self.convert_ssa_value_to_register_value_or_array(*value_id, dfg) + }); + let output_registers = vecmap(result_ids, |value_id| { + self.convert_ssa_value_to_register_value_or_array(*value_id, dfg) + }); + + self.brillig_context.foreign_call_instruction( + func_name.to_owned(), + &input_registers, + &output_registers, + ); + } + _ => { + unreachable!("only foreign function calls supported in unconstrained functions") + } + }, + Instruction::Truncate { value, .. } => { + let result_ids = dfg.instruction_results(instruction_id); + let destination = self + .function_context + .get_or_create_register(self.brillig_context, result_ids[0]); + let source = self.convert_ssa_value(*value, dfg); + self.brillig_context.truncate_instruction(destination, source); + } + Instruction::Cast(value, target_type) => { + let result_ids = dfg.instruction_results(instruction_id); + let destination = self + .function_context + .get_or_create_register(self.brillig_context, result_ids[0]); + let source = self.convert_ssa_value(*value, dfg); + self.convert_cast(destination, source, target_type, &dfg.type_of_value(*value)); + } + Instruction::ArrayGet { array, index } => { + let result_ids = dfg.instruction_results(instruction_id); + let destination = self + .function_context + .get_or_create_register(self.brillig_context, result_ids[0]); + let array_register = self.convert_ssa_value(*array, dfg); + let index_register = self.convert_ssa_value(*index, dfg); + self.brillig_context.array_get(array_register, index_register, destination); + } + // Array set operation in SSA returns a new array that is a copy of the parameter array + // With a specific value changed. + Instruction::ArraySet { array, index, value } => { + let result_ids = dfg.instruction_results(instruction_id); + let destination = self + .function_context + .get_or_create_register(self.brillig_context, result_ids[0]); + + // First issue a array copy to the destination + let array_size = compute_size_of_type(&dfg.type_of_value(*array)); + self.brillig_context.allocate_fixed_length_array(destination, array_size); + let source_array_register: RegisterIndex = self.convert_ssa_value(*array, dfg); + let size_register = self.brillig_context.make_constant(array_size.into()); + self.brillig_context.copy_array_instruction( + source_array_register, + destination, + size_register, + ); + + // Then set the value in the newly created array + let index_register = self.convert_ssa_value(*index, dfg); + let value_register = self.convert_ssa_value(*value, dfg); + self.brillig_context.array_set(destination, index_register, value_register); + } + _ => todo!("ICE: Instruction not supported {instruction:?}"), + }; + } + + /// This function allows storing a Value in memory starting at the address specified by the + /// address_register. The value can be a single value or an array. The function will recursively + /// store the value in memory. + fn store_in_memory( + &mut self, + address_register: RegisterIndex, + value_id: ValueId, + dfg: &DataFlowGraph, + ) { + let value = &dfg[value_id]; + match value { + Value::Param { .. } | Value::Instruction { .. } | Value::NumericConstant { .. } => { + let value_register = self.convert_ssa_value(value_id, dfg); + self.brillig_context.store_instruction(address_register, value_register); + } + Value::Array { array, element_type } => { + // Allocate a register for the iterator + let iterator_register = self.brillig_context.allocate_register(); + // Set the iterator to the address of the array + self.brillig_context.mov_instruction(iterator_register, address_register); + + let size_of_item_register = self + .brillig_context + .make_constant(compute_size_of_composite_type(element_type).into()); + + for element_id in array.iter() { + // Store the item in memory + self.store_in_memory(iterator_register, *element_id, dfg); + // Increment the iterator by the size of the items + self.brillig_context.binary_instruction( + iterator_register, + size_of_item_register, + iterator_register, + BrilligBinaryOp::Integer { + op: BinaryIntOp::Add, + bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + }, + ); + } + } + _ => unimplemented!("ICE: Value {:?} not storeable in memory", value), + } + } + + /// Converts an SSA cast to a sequence of Brillig opcodes. + /// Casting is only necessary when shrinking the bit size of a numeric value. + fn convert_cast( + &mut self, + destination: RegisterIndex, + source: RegisterIndex, + target_type: &Type, + source_type: &Type, + ) { + fn numeric_to_bit_size(typ: &NumericType) -> u32 { + match typ { + NumericType::Signed { bit_size } | NumericType::Unsigned { bit_size } => *bit_size, + NumericType::NativeField => FieldElement::max_num_bits(), + } + } + // Casting is only valid for numeric types + // This should be checked by the frontend, so we panic if this is the case + let (source_numeric_type, target_numeric_type) = match (source_type, target_type) { + (Type::Numeric(source_numeric_type), Type::Numeric(target_numeric_type)) => { + (source_numeric_type, target_numeric_type) + } + _ => unimplemented!("The cast operation is only valid for integers."), + }; + let source_bit_size = numeric_to_bit_size(source_numeric_type); + let target_bit_size = numeric_to_bit_size(target_numeric_type); + // Casting from a larger bit size to a smaller bit size (narrowing cast) + // requires a cast instruction. + // If its a widening cast, ie casting from a smaller bit size to a larger bit size + // we simply put a mov instruction as a no-op + // + // Field elements by construction always have the largest bit size + // This means that casting to a Field element, will always be a widening cast + // and therefore a no-op. Conversely, casting from a Field element + // will always be a narrowing cast and therefore a cast instruction + if source_bit_size > target_bit_size { + self.brillig_context.cast_instruction(destination, source, target_bit_size); + } else { + self.brillig_context.mov_instruction(destination, source); + } + } + + /// Converts the Binary instruction into a sequence of Brillig opcodes. + fn convert_ssa_binary( + &mut self, + binary: &Binary, + dfg: &DataFlowGraph, + result_register: RegisterIndex, + ) { + let binary_type = + type_of_binary_operation(dfg[binary.lhs].get_type(), dfg[binary.rhs].get_type()); + + let left = self.convert_ssa_value(binary.lhs, dfg); + let right = self.convert_ssa_value(binary.rhs, dfg); + + let brillig_binary_op = + convert_ssa_binary_op_to_brillig_binary_op(binary.operator, binary_type); + + self.brillig_context.binary_instruction(left, right, result_register, brillig_binary_op); + } + + /// Converts an SSA `ValueId` into a `RegisterIndex`. + fn convert_ssa_value(&mut self, value_id: ValueId, dfg: &DataFlowGraph) -> RegisterIndex { + let value = &dfg[value_id]; + + let register = match value { + Value::Param { .. } | Value::Instruction { .. } => { + // All block parameters and instruction results should have already been + // converted to registers so we fetch from the cache. + self.function_context.get_or_create_register(self.brillig_context, value_id) + } + Value::NumericConstant { constant, .. } => { + let register_index = + self.function_context.get_or_create_register(self.brillig_context, value_id); + + self.brillig_context.const_instruction(register_index, (*constant).into()); + register_index + } + Value::Array { .. } => { + let address_register = self.brillig_context.allocate_register(); + self.brillig_context.allocate_fixed_length_array( + address_register, + compute_size_of_type(&dfg.type_of_value(value_id)), + ); + self.store_in_memory(address_register, value_id, dfg); + address_register + } + _ => { + todo!("ICE: Should have been in cache {value:?}") + } + }; + register + } + + fn convert_ssa_value_to_register_value_or_array( + &mut self, + value_id: ValueId, + dfg: &DataFlowGraph, + ) -> RegisterValueOrArray { + let register_index = self.convert_ssa_value(value_id, dfg); + let typ = dfg[value_id].get_type(); + match typ { + Type::Numeric(_) => RegisterValueOrArray::RegisterIndex(register_index), + Type::Array(_, size) => RegisterValueOrArray::HeapArray(register_index, size), + _ => { + unreachable!("type not supported for conversion into brillig register") + } + } + } +} + +/// Returns the type of the operation considering the types of the operands +/// TODO: SSA issues binary operations between fields and integers. +/// This probably should be explicitly casted in SSA to avoid having to coerce at this level. +pub(crate) fn type_of_binary_operation(lhs_type: Type, rhs_type: Type) -> Type { + match (lhs_type, rhs_type) { + // If either side is a Field constant then, we coerce into the type + // of the other operand + (Type::Numeric(NumericType::NativeField), typ) + | (typ, Type::Numeric(NumericType::NativeField)) => typ, + // If both sides are numeric type, then we expect their types to be + // the same. + (Type::Numeric(lhs_type), Type::Numeric(rhs_type)) => { + assert_eq!( + lhs_type, rhs_type, + "lhs and rhs types in a binary operation are always the same" + ); + Type::Numeric(lhs_type) + } + (lhs_type, rhs_type) => { + unreachable!( + "ICE: Binary operation between types {:?} and {:?} is not allowed", + lhs_type, rhs_type + ) + } + } +} + +/// Convert an SSA binary operation into: +/// - Brillig Binary Integer Op, if it is a integer type +/// - Brillig Binary Field Op, if it is a field type +pub(crate) fn convert_ssa_binary_op_to_brillig_binary_op( + ssa_op: BinaryOp, + typ: Type, +) -> BrilligBinaryOp { + // First get the bit size and whether its a signed integer, if it is a numeric type + // if it is not,then we return None, indicating that + // it is a Field. + let bit_size_signedness = match typ { + Type::Numeric(numeric_type) => match numeric_type { + NumericType::Signed { bit_size } => Some((bit_size, true)), + NumericType::Unsigned { bit_size } => Some((bit_size, false)), + NumericType::NativeField => None, + }, + _ => unreachable!("only numeric types are allowed in binary operations. References are handled separately"), + }; + + fn binary_op_to_field_op(op: BinaryOp) -> BrilligBinaryOp { + let operation = match op { + BinaryOp::Add => BinaryFieldOp::Add, + BinaryOp::Sub => BinaryFieldOp::Sub, + BinaryOp::Mul => BinaryFieldOp::Mul, + BinaryOp::Div => BinaryFieldOp::Div, + BinaryOp::Eq => BinaryFieldOp::Equals, + _ => unreachable!( + "Field type cannot be used with {op}. This should have been caught by the frontend" + ), + }; + + BrilligBinaryOp::Field { op: operation } + } + + fn binary_op_to_int_op(op: BinaryOp, bit_size: u32, is_signed: bool) -> BrilligBinaryOp { + let operation = match op { + BinaryOp::Add => BinaryIntOp::Add, + BinaryOp::Sub => BinaryIntOp::Sub, + BinaryOp::Mul => BinaryIntOp::Mul, + BinaryOp::Div => { + if is_signed { + BinaryIntOp::SignedDiv + } else { + BinaryIntOp::UnsignedDiv + } + } + BinaryOp::Mod => { + return BrilligBinaryOp::Modulo { is_signed_integer: is_signed, bit_size } + } + BinaryOp::Eq => BinaryIntOp::Equals, + BinaryOp::Lt => BinaryIntOp::LessThan, + BinaryOp::And => BinaryIntOp::And, + BinaryOp::Or => BinaryIntOp::Or, + BinaryOp::Xor => BinaryIntOp::Xor, + BinaryOp::Shl => BinaryIntOp::Shl, + BinaryOp::Shr => BinaryIntOp::Shr, + }; + + BrilligBinaryOp::Integer { op: operation, bit_size } + } + + // If bit size is available then it is a binary integer operation + match bit_size_signedness { + Some((bit_size, is_signed)) => binary_op_to_int_op(ssa_op, bit_size, is_signed), + None => binary_op_to_field_op(ssa_op), + } +} + +/// Computes the size of an SSA composite type +fn compute_size_of_composite_type(typ: &CompositeType) -> usize { + typ.iter().map(compute_size_of_type).sum() +} + +/// Finds out the size of a given SSA type +/// This is needed to store values in memory +fn compute_size_of_type(typ: &Type) -> usize { + match typ { + Type::Numeric(_) => 1, + Type::Array(types, item_count) => compute_size_of_composite_type(types) * item_count, + _ => todo!("ICE: Type not supported {typ:?}"), + } +} diff --git a/crates/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs b/crates/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs new file mode 100644 index 00000000000..60de8743373 --- /dev/null +++ b/crates/noirc_evaluator/src/brillig/brillig_gen/brillig_fn.rs @@ -0,0 +1,41 @@ +use std::collections::HashMap; + +use acvm::acir::brillig_vm::RegisterIndex; + +use crate::{ + brillig::brillig_ir::BrilligContext, + ssa_refactor::ir::{function::FunctionId, value::ValueId}, +}; + +pub(crate) struct FunctionContext { + pub(crate) function_id: FunctionId, + /// Map from SSA values to Register Indices. + pub(crate) ssa_value_to_register: HashMap, +} + +impl FunctionContext { + /// Gets a `RegisterIndex` for a `ValueId`, if one already exists + /// or creates a new `RegisterIndex` using the latest available + /// free register. + pub(crate) fn get_or_create_register( + &mut self, + brillig_context: &mut BrilligContext, + value: ValueId, + ) -> RegisterIndex { + if let Some(register_index) = self.ssa_value_to_register.get(&value) { + return *register_index; + } + + let register = brillig_context.allocate_register(); + + // Cache the `ValueId` so that if we call it again, it will + // return the register that has just been created. + // + // WARNING: This assumes that a register has not been + // modified. If a MOV instruction has overwritten the value + // at a register, then this cache will be invalid. + self.ssa_value_to_register.insert(value, register); + + register + } +} diff --git a/crates/noirc_evaluator/src/brillig/brillig_ir.rs b/crates/noirc_evaluator/src/brillig/brillig_ir.rs new file mode 100644 index 00000000000..0c0696fa130 --- /dev/null +++ b/crates/noirc_evaluator/src/brillig/brillig_ir.rs @@ -0,0 +1,555 @@ +//! This module is an abstraction layer over `Brillig` +//! To allow for separation of concerns, it knows nothing +//! about SSA types, and can therefore be tested independently. +//! `brillig_gen` is therefore the module which combines both +//! ssa types and types in this module. +//! A similar paradigm can be seen with the `acir_ir` module. +pub(crate) mod artifact; +pub(crate) mod registers; + +use self::{ + artifact::{BrilligArtifact, UnresolvedJumpLocation}, + registers::BrilligRegistersContext, +}; +use acvm::{ + acir::brillig_vm::{ + BinaryFieldOp, BinaryIntOp, Opcode as BrilligOpcode, RegisterIndex, RegisterValueOrArray, + Value, + }, + FieldElement, +}; + +/// Integer arithmetic in Brillig is limited to 127 bit +/// integers. +/// +/// We could lift this in the future and have Brillig +/// do big integer arithmetic when it exceeds the field size +/// or we could have users re-implement big integer arithmetic +/// in Brillig. +/// Since constrained functions do not have this property, it +/// would mean that unconstrained functions will differ from +/// constrained functions in terms of syntax compatibility. +pub(crate) const BRILLIG_INTEGER_ARITHMETIC_BIT_SIZE: u32 = 127; +pub(crate) const BRILLIG_MEMORY_ADDRESSING_BIT_SIZE: u32 = 64; + +// Registers reserved in runtime for special purposes. +pub(crate) enum ReservedRegisters { + /// This register stores the stack pointer. Allocations must be done after this pointer. + StackPointer = 0, + /// Number of reserved registers + Len = 1, +} + +impl ReservedRegisters { + /// Returns the length of the reserved registers + pub(crate) fn len() -> usize { + ReservedRegisters::Len as usize + } + + /// Returns the stack pointer register. This will get used to allocate memory in runtime. + pub(crate) fn stack_pointer() -> RegisterIndex { + RegisterIndex::from(ReservedRegisters::StackPointer as usize) + } +} + +/// Brillig context object that is used while constructing the +/// Brillig bytecode. +pub(crate) struct BrilligContext { + obj: BrilligArtifact, + /// Tracks register allocations + registers: BrilligRegistersContext, + /// Context label, must be unique with respect to the function + /// being linked. + context_label: String, + /// Section label, used to separate sections of code + section_label: usize, +} + +impl BrilligContext { + /// Initial context state + pub(crate) fn new() -> BrilligContext { + BrilligContext { + obj: BrilligArtifact::default(), + registers: BrilligRegistersContext::new(), + context_label: String::default(), + section_label: 0, + } + } + + /// Adds the instructions needed to handle entry point parameters + /// And sets the starting value of the reserved registers + pub(crate) fn entry_point_instruction(&mut self, num_arguments: usize) { + // Translate the inputs by the reserved registers offset + for i in (0..num_arguments).rev() { + self.mov_instruction(self.user_register_index(i), RegisterIndex::from(i)); + } + // Set the initial value of the stack pointer register + self.const_instruction(ReservedRegisters::stack_pointer(), Value::from(0_usize)); + } + + /// Adds a brillig instruction to the brillig byte code + pub(crate) fn push_opcode(&mut self, opcode: BrilligOpcode) { + self.obj.byte_code.push(opcode); + } + + /// Returns the artifact + pub(crate) fn artifact(self) -> BrilligArtifact { + self.obj + } + + /// Allocates an array of size `size` and stores the pointer to the array + /// in `pointer_register` + pub(crate) fn allocate_fixed_length_array( + &mut self, + pointer_register: RegisterIndex, + size: usize, + ) { + let size_register = self.make_constant(size.into()); + self.allocate_array_instruction(pointer_register, size_register); + } + + /// Allocates an array of size contained in size_register and stores the + /// pointer to the array in `pointer_register` + pub(crate) fn allocate_array_instruction( + &mut self, + pointer_register: RegisterIndex, + size_register: RegisterIndex, + ) { + self.push_opcode(BrilligOpcode::Mov { + destination: pointer_register, + source: ReservedRegisters::stack_pointer(), + }); + self.push_opcode(BrilligOpcode::BinaryIntOp { + destination: ReservedRegisters::stack_pointer(), + op: BinaryIntOp::Add, + bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + lhs: ReservedRegisters::stack_pointer(), + rhs: size_register, + }); + } + + /// Gets the value in the array at index `index` and stores it in `result` + pub(crate) fn array_get( + &mut self, + array_ptr: RegisterIndex, + index: RegisterIndex, + result: RegisterIndex, + ) { + // Computes array_ptr + index, ie array[index] + let index_of_element_in_memory = self.allocate_register(); + self.binary_instruction( + array_ptr, + index, + index_of_element_in_memory, + BrilligBinaryOp::Field { op: BinaryFieldOp::Add }, + ); + + self.load_instruction(result, index_of_element_in_memory); + // Free up temporary register + self.deallocate_register(index_of_element_in_memory); + } + + /// Sets the item in the array at index `index` to `value` + pub(crate) fn array_set( + &mut self, + array_ptr: RegisterIndex, + index: RegisterIndex, + value: RegisterIndex, + ) { + // Computes array_ptr + index, ie array[index] + let index_of_element_in_memory = self.allocate_register(); + self.binary_instruction( + array_ptr, + index, + index_of_element_in_memory, + BrilligBinaryOp::Field { op: BinaryFieldOp::Add }, + ); + + self.store_instruction(index_of_element_in_memory, value); + // Free up temporary register + self.deallocate_register(index_of_element_in_memory); + } + + /// Copies the values of an array pointed by source with length stored in `num_elements_register` + /// Into the array pointed by destination + pub(crate) fn copy_array_instruction( + &mut self, + source: RegisterIndex, + destination: RegisterIndex, + num_elements_register: RegisterIndex, + ) { + let index_register = self.make_constant(0_u128.into()); + + let loop_label = self.next_section_label(); + self.enter_next_section(); + + // Loop body + + // Check if index < num_elements + let index_less_than_array_len = self.allocate_register(); + self.binary_instruction( + index_register, + num_elements_register, + index_less_than_array_len, + BrilligBinaryOp::Integer { + op: BinaryIntOp::LessThan, + bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + }, + ); + + let exit_loop_label = self.next_section_label(); + + self.not_instruction(index_less_than_array_len, index_less_than_array_len); + self.jump_if_instruction(index_less_than_array_len, exit_loop_label); + + // Copy the element from source to destination + let value_register = self.allocate_register(); + self.array_get(source, index_register, value_register); + self.array_set(destination, index_register, value_register); + + // Increment the index register + let one_register = self.make_constant(1u128.into()); + self.binary_instruction( + index_register, + one_register, + index_register, + BrilligBinaryOp::Integer { + op: BinaryIntOp::Add, + bit_size: BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, + }, + ); + + self.jump_instruction(loop_label); + + // Exit the loop + self.enter_next_section(); + // Deallocate our temporary registers + self.deallocate_register(index_less_than_array_len); + self.deallocate_register(value_register); + self.deallocate_register(one_register); + self.deallocate_register(index_register); + } + + /// Adds a label to the next opcode + pub(crate) fn enter_context(&mut self, label: T) { + self.context_label = label.to_string(); + self.section_label = 0; + // Add a context label to the next opcode + self.obj.add_label_at_position(label.to_string(), self.obj.index_of_next_opcode()); + // Add a section label to the next opcode + self.obj + .add_label_at_position(self.current_section_label(), self.obj.index_of_next_opcode()); + } + + /// Increments the section label and adds a section label to the next opcode + fn enter_next_section(&mut self) { + self.section_label += 1; + self.obj + .add_label_at_position(self.current_section_label(), self.obj.index_of_next_opcode()); + } + + /// Internal function used to compute the section labels + fn compute_section_label(&self, section: usize) -> String { + format!("{}-{}", self.context_label, section) + } + + /// Returns the next section label + fn next_section_label(&self) -> String { + self.compute_section_label(self.section_label + 1) + } + + /// Returns the current section label + fn current_section_label(&self) -> String { + self.compute_section_label(self.section_label) + } + + /// Adds a unresolved `Jump` instruction to the bytecode. + pub(crate) fn jump_instruction(&mut self, target_label: T) { + self.add_unresolved_jump(BrilligOpcode::Jump { location: 0 }, target_label.to_string()); + } + + /// Adds a unresolved `JumpIf` instruction to the bytecode. + pub(crate) fn jump_if_instruction( + &mut self, + condition: RegisterIndex, + target_label: T, + ) { + self.add_unresolved_jump( + BrilligOpcode::JumpIf { condition, location: 0 }, + target_label.to_string(), + ); + } + + /// Adds a unresolved `Jump` instruction to the bytecode. + fn add_unresolved_jump( + &mut self, + jmp_instruction: BrilligOpcode, + destination: UnresolvedJumpLocation, + ) { + self.obj.add_unresolved_jump(jmp_instruction, destination); + } + + /// Returns a user defined (non-reserved) register index. + fn user_register_index(&self, index: usize) -> RegisterIndex { + RegisterIndex::from(index + ReservedRegisters::len()) + } + + /// Allocates an unused register. + pub(crate) fn allocate_register(&mut self) -> RegisterIndex { + self.registers.allocate_register() + } + + /// Push a register to the deallocation list, ready for reuse. + /// TODO(AD): currently, register deallocation is only done with immediate values. + /// TODO(AD): See https://github.com/noir-lang/noir/issues/1720 + pub(crate) fn deallocate_register(&mut self, register_index: RegisterIndex) { + self.registers.deallocate_register(register_index); + } +} + +impl BrilligContext { + /// Emits brillig bytecode to jump to a trap condition if `condition` + /// is false. + pub(crate) fn constrain_instruction(&mut self, condition: RegisterIndex) { + self.add_unresolved_jump( + BrilligOpcode::JumpIf { condition, location: 0 }, + self.next_section_label(), + ); + self.push_opcode(BrilligOpcode::Trap); + self.enter_next_section(); + } + + /// Processes a return instruction. + /// + /// For Brillig, the return is implicit, since there is no explicit return instruction. + /// The caller will take `N` values from the Register starting at register index 0. + /// `N` indicates the number of return values expected. + /// + /// Brillig does not have an explicit return instruction, so this + /// method will move all register values to the first `N` values in + /// the VM. + pub(crate) fn return_instruction(&mut self, return_registers: &[RegisterIndex]) { + for (destination_index, return_register) in return_registers.iter().enumerate() { + // In case we have fewer return registers than indices to write to, ensure we've allocated this register + self.registers.ensure_register_is_allocated(destination_index.into()); + self.mov_instruction(destination_index.into(), *return_register); + } + self.stop_instruction(); + } + + /// Emits a `mov` instruction. + /// + /// Copies the value at `source` into `destination` + pub(crate) fn mov_instruction(&mut self, destination: RegisterIndex, source: RegisterIndex) { + self.push_opcode(BrilligOpcode::Mov { destination, source }); + } + + /// Processes a binary instruction according `operation`. + /// + /// This method will compute lhs rhs + /// and store the result in the `result` register. + pub(crate) fn binary_instruction( + &mut self, + lhs: RegisterIndex, + rhs: RegisterIndex, + result: RegisterIndex, + operation: BrilligBinaryOp, + ) { + match operation { + BrilligBinaryOp::Field { op } => { + let opcode = BrilligOpcode::BinaryFieldOp { op, destination: result, lhs, rhs }; + self.push_opcode(opcode); + } + BrilligBinaryOp::Integer { op, bit_size } => { + let opcode = + BrilligOpcode::BinaryIntOp { op, destination: result, bit_size, lhs, rhs }; + self.push_opcode(opcode); + } + BrilligBinaryOp::Modulo { is_signed_integer, bit_size } => { + self.modulo_instruction(result, lhs, rhs, bit_size, is_signed_integer); + } + } + } + + /// Stores the value of `constant` in the `result` register + pub(crate) fn const_instruction(&mut self, result: RegisterIndex, constant: Value) { + self.push_opcode(BrilligOpcode::Const { destination: result, value: constant }); + } + + /// Processes a not instruction. + /// + /// Not is computed using a subtraction operation as there is no native not instruction + /// in Brillig. + pub(crate) fn not_instruction(&mut self, condition: RegisterIndex, result: RegisterIndex) { + let one = self.make_constant(Value::from(FieldElement::one())); + + // Compile !x as (1 - x) + let opcode = BrilligOpcode::BinaryIntOp { + destination: result, + op: BinaryIntOp::Sub, + bit_size: 1, + lhs: one, + rhs: condition, + }; + self.push_opcode(opcode); + } + + /// Processes a foreign call instruction. + /// + /// Note: the function being called is external and will + /// not be linked during brillig generation. + pub(crate) fn foreign_call_instruction( + &mut self, + func_name: String, + inputs: &[RegisterValueOrArray], + outputs: &[RegisterValueOrArray], + ) { + // TODO(https://github.com/noir-lang/acvm/issues/366): Enable multiple inputs and outputs to a foreign call + let opcode = BrilligOpcode::ForeignCall { + function: func_name, + destinations: outputs.to_vec(), + inputs: inputs.to_vec(), + }; + self.push_opcode(opcode); + } + + /// Emits a load instruction + pub(crate) fn load_instruction( + &mut self, + destination: RegisterIndex, + source_pointer: RegisterIndex, + ) { + self.push_opcode(BrilligOpcode::Load { destination, source_pointer }); + } + + /// Emits a store instruction + pub(crate) fn store_instruction( + &mut self, + destination_pointer: RegisterIndex, + source: RegisterIndex, + ) { + self.push_opcode(BrilligOpcode::Store { destination_pointer, source }); + } + + /// Emits a truncate instruction. + /// + /// Note: Truncation is used as an optimization in the SSA IR + /// for the ACIR generation pass; ACIR gen does not overflow + /// on every integer operation since it would be in-efficient. + /// Instead truncation instructions are emitted as to when a + /// truncation should be done. + /// For Brillig, all integer operations will overflow as its cheap. + pub(crate) fn truncate_instruction( + &mut self, + destination_of_truncated_value: RegisterIndex, + value_to_truncate: RegisterIndex, + ) { + // Effectively a no-op because brillig already has implicit truncation on integer + // operations. We need only copy the value to it's destination. + self.mov_instruction(destination_of_truncated_value, value_to_truncate); + } + + /// Emits a stop instruction + pub(crate) fn stop_instruction(&mut self) { + self.push_opcode(BrilligOpcode::Stop); + } + + /// Returns a register which holds the value of a constant + pub(crate) fn make_constant(&mut self, constant: Value) -> RegisterIndex { + let register = self.allocate_register(); + self.const_instruction(register, constant); + register + } + + /// Computes left % right by emitting the necessary Brillig opcodes. + /// + /// This is done by using the following formula: + /// + /// a % b = a - (b * (a / b)) + /// + /// Brillig does not have an explicit modulo operation, + /// so we must emit multiple opcodes and process it differently + /// to other binary instructions. + pub(crate) fn modulo_instruction( + &mut self, + result_register: RegisterIndex, + left: RegisterIndex, + right: RegisterIndex, + bit_size: u32, + signed: bool, + ) { + let scratch_register_i = self.allocate_register(); + let scratch_register_j = self.allocate_register(); + + // i = left / right + self.push_opcode(BrilligOpcode::BinaryIntOp { + op: match signed { + true => BinaryIntOp::SignedDiv, + false => BinaryIntOp::UnsignedDiv, + }, + destination: scratch_register_i, + bit_size, + lhs: left, + rhs: right, + }); + + // j = i * right + self.push_opcode(BrilligOpcode::BinaryIntOp { + op: BinaryIntOp::Mul, + destination: scratch_register_j, + bit_size, + lhs: scratch_register_i, + rhs: right, + }); + + // result_register = left - j + self.push_opcode(BrilligOpcode::BinaryIntOp { + op: BinaryIntOp::Sub, + destination: result_register, + bit_size, + lhs: left, + rhs: scratch_register_j, + }); + // Free scratch registers + self.deallocate_register(scratch_register_i); + self.deallocate_register(scratch_register_j); + } + + /// Emits a modulo instruction against 2**target_bit_size + /// + /// Integer arithmetic in Brillig is currently constrained to 127 bit integers. + /// We restrict the cast operation, so that integer types over 127 bits + /// cannot be created. + pub(crate) fn cast_instruction( + &mut self, + destination: RegisterIndex, + source: RegisterIndex, + target_bit_size: u32, + ) { + assert!( + target_bit_size <= BRILLIG_INTEGER_ARITHMETIC_BIT_SIZE, + "tried to cast to a bit size greater than allowed {target_bit_size}" + ); + + // The brillig VM performs all arithmetic operations modulo 2**bit_size + // So to cast any value to a target bit size we can just issue a no-op arithmetic operation + // With bit size equal to target_bit_size + let zero_register = self.make_constant(Value::from(FieldElement::zero())); + self.binary_instruction( + source, + zero_register, + destination, + BrilligBinaryOp::Integer { op: BinaryIntOp::Add, bit_size: target_bit_size }, + ); + self.deallocate_register(zero_register); + } +} + +/// Type to encapsulate the binary operation types in Brillig +pub(crate) enum BrilligBinaryOp { + Field { op: BinaryFieldOp }, + Integer { op: BinaryIntOp, bit_size: u32 }, + // Modulo operation requires more than one opcode + // Brillig. + Modulo { is_signed_integer: bool, bit_size: u32 }, +} diff --git a/crates/noirc_evaluator/src/brillig/brillig_ir/artifact.rs b/crates/noirc_evaluator/src/brillig/brillig_ir/artifact.rs new file mode 100644 index 00000000000..3c6be408a32 --- /dev/null +++ b/crates/noirc_evaluator/src/brillig/brillig_ir/artifact.rs @@ -0,0 +1,147 @@ +use acvm::acir::brillig_vm::Opcode as BrilligOpcode; +use std::collections::HashMap; + +#[derive(Default, Debug, Clone)] +/// Artifacts resulting from the compilation of a function into brillig byte code. +/// Currently it is just the brillig bytecode of the function. +pub(crate) struct BrilligArtifact { + pub(crate) byte_code: Vec, + /// The set of jumps that need to have their locations + /// resolved. + unresolved_jumps: Vec<(JumpInstructionPosition, UnresolvedJumpLocation)>, + /// A map of labels to their position in byte code. + labels: HashMap, +} + +/// A pointer to a location in the opcode. +pub(crate) type OpcodeLocation = usize; +/// An identifier for a location in the code. +/// +/// It is assumed that an entity will keep a map +/// of labels to Opcode locations. +pub(crate) type Label = String; +/// Pointer to a unresolved Jump instruction in +/// the bytecode. +pub(crate) type JumpInstructionPosition = OpcodeLocation; + +/// When constructing the bytecode, there may be instructions +/// which require one to jump to a specific region of code (function) +/// +/// The position of a function cannot always be known +/// at this point in time, so Jumps are unresolved +/// until all functions/all of the bytecode has been processed. +/// `Label` is used as the jump location and once all of the bytecode +/// has been processed, the jumps are resolved using a map from Labels +/// to their position in the bytecode. +pub(crate) type UnresolvedJumpLocation = Label; + +impl BrilligArtifact { + /// Link two Brillig artifacts together and resolve all unresolved jump instructions. + pub(crate) fn link(&mut self, obj: &BrilligArtifact) -> Vec { + self.append_artifact(obj); + self.resolve_jumps(); + self.byte_code.clone() + } + + /// Link with an external brillig artifact. + /// + /// This method will offset the positions in the Brillig artifact to + /// account for the fact that it is being appended to the end of this + /// Brillig artifact (self). + fn append_artifact(&mut self, obj: &BrilligArtifact) { + let offset = self.index_of_next_opcode(); + for (jump_label, jump_location) in &obj.unresolved_jumps { + self.unresolved_jumps.push((jump_label + offset, jump_location.clone())); + } + + for (label_id, position_in_bytecode) in &obj.labels { + let old_value = self.labels.insert(label_id.clone(), position_in_bytecode + offset); + assert!(old_value.is_none(), "overwriting label {label_id} {old_value:?}"); + } + + self.byte_code.extend_from_slice(&obj.byte_code); + } + + /// Adds a brillig instruction to the brillig byte code + pub(crate) fn push_opcode(&mut self, opcode: BrilligOpcode) { + self.byte_code.push(opcode); + } + + /// Adds a unresolved jump to be fixed at the end of bytecode processing. + pub(crate) fn add_unresolved_jump( + &mut self, + jmp_instruction: BrilligOpcode, + destination: UnresolvedJumpLocation, + ) { + assert!( + Self::is_jmp_instruction(&jmp_instruction), + "expected a jump instruction, but found {jmp_instruction:?}" + ); + + self.unresolved_jumps.push((self.index_of_next_opcode(), destination)); + self.push_opcode(jmp_instruction); + } + + /// Returns true if the opcode is a jump instruction + fn is_jmp_instruction(instruction: &BrilligOpcode) -> bool { + matches!( + instruction, + BrilligOpcode::JumpIfNot { .. } + | BrilligOpcode::JumpIf { .. } + | BrilligOpcode::Jump { .. } + ) + } + + /// Adds a label in the bytecode to specify where this block's + /// opcodes will start. + pub(crate) fn add_label_at_position(&mut self, label: String, position: OpcodeLocation) { + let old_value = self.labels.insert(label.clone(), position); + assert!( + old_value.is_none(), + "overwriting label {label}. old_value = {old_value:?}, new_value = {position}" + ); + } + + /// Returns the index of the next opcode. + /// + /// This is useful for labelling regions of code + /// before you have generated the opcodes for the region. + pub(crate) fn index_of_next_opcode(&self) -> OpcodeLocation { + self.byte_code.len() + } + + /// Resolves all of the unresolved jumps in the program. + /// + /// Note: This should only be called once all blocks are processed and + /// linkage with other bytecode has happened. + fn resolve_jumps(&mut self) { + for (location_of_jump, unresolved_location) in &self.unresolved_jumps { + let resolved_location = self.labels[unresolved_location]; + + let jump_instruction = self.byte_code[*location_of_jump].clone(); + match jump_instruction { + BrilligOpcode::Jump { location } => { + assert_eq!(location, 0, "location is not zero, which means that the jump label does not need resolving"); + + self.byte_code[*location_of_jump] = + BrilligOpcode::Jump { location: resolved_location }; + } + BrilligOpcode::JumpIfNot { condition, location } => { + assert_eq!(location, 0, "location is not zero, which means that the jump label does not need resolving"); + + self.byte_code[*location_of_jump] = + BrilligOpcode::JumpIfNot { condition, location: resolved_location }; + } + BrilligOpcode::JumpIf { condition, location } => { + assert_eq!(location, 0, "location is not zero, which means that the jump label does not need resolving"); + + self.byte_code[*location_of_jump] = + BrilligOpcode::JumpIf { condition, location: resolved_location }; + } + _ => unreachable!( + "all jump labels should point to a jump instruction in the bytecode" + ), + } + } + } +} diff --git a/crates/noirc_evaluator/src/brillig/brillig_ir/registers.rs b/crates/noirc_evaluator/src/brillig/brillig_ir/registers.rs new file mode 100644 index 00000000000..cad5670d76b --- /dev/null +++ b/crates/noirc_evaluator/src/brillig/brillig_ir/registers.rs @@ -0,0 +1,59 @@ +use acvm::acir::brillig_vm::RegisterIndex; + +use super::ReservedRegisters; + +/// Every brillig stack frame/call context has its own view of register space. +/// This is maintained by copying these registers to the stack during calls and reading them back. +/// +/// Each has a stack base pointer from which all stack allocations can be offset. +pub(crate) struct BrilligRegistersContext { + /// A free-list of registers that have been deallocated and can be used again. + /// TODO(AD): currently, register deallocation is only done with immediate values. + /// TODO(AD): See https://github.com/noir-lang/noir/issues/1720 + deallocated_registers: Vec, + /// A usize indicating the next un-used register. + next_free_register_index: usize, +} + +impl BrilligRegistersContext { + /// Initial register allocation + pub(crate) fn new() -> BrilligRegistersContext { + BrilligRegistersContext { + deallocated_registers: Vec::new(), + next_free_register_index: ReservedRegisters::len(), + } + } + + /// Ensures a register is allocated. + pub(crate) fn ensure_register_is_allocated(&mut self, register: RegisterIndex) { + let index = register.to_usize(); + if index < self.next_free_register_index { + // If it could be allocated, check if it's in the deallocated list and remove it from there + self.deallocated_registers.retain(|&r| r != register); + } else { + // If it couldn't yet be, expand the register space. + self.next_free_register_index = index + 1; + } + } + + /// Creates a new register. + pub(crate) fn allocate_register(&mut self) -> RegisterIndex { + // If we have a register in our free list of deallocated registers, + // consume it first. This prioritizes reuse. + if let Some(register) = self.deallocated_registers.pop() { + return register; + } + // Otherwise, move to our latest register. + let register = RegisterIndex::from(self.next_free_register_index); + self.next_free_register_index += 1; + register + } + + /// Push a register to the deallocation list, ready for reuse. + /// TODO(AD): currently, register deallocation is only done with immediate values. + /// TODO(AD): See https://github.com/noir-lang/noir/issues/1720 + pub(crate) fn deallocate_register(&mut self, register_index: RegisterIndex) { + assert!(!self.deallocated_registers.contains(®ister_index)); + self.deallocated_registers.push(register_index); + } +} diff --git a/crates/noirc_evaluator/src/brillig/memory.rs b/crates/noirc_evaluator/src/brillig/memory.rs deleted file mode 100644 index 099dbfb7704..00000000000 --- a/crates/noirc_evaluator/src/brillig/memory.rs +++ /dev/null @@ -1,15 +0,0 @@ -/// Simple memory allocator for brillig -/// For now it just tracks a free memory pointer -/// Will probably get smarter in the future -#[derive(Default)] -pub(crate) struct BrilligMemory { - free_mem_pointer: usize, -} - -impl BrilligMemory { - pub(crate) fn allocate(&mut self, size: usize) -> usize { - let start = self.free_mem_pointer; - self.free_mem_pointer += size; - start - } -} diff --git a/crates/noirc_evaluator/src/brillig/mod.rs b/crates/noirc_evaluator/src/brillig/mod.rs index 5c28619194f..19d750a4544 100644 --- a/crates/noirc_evaluator/src/brillig/mod.rs +++ b/crates/noirc_evaluator/src/brillig/mod.rs @@ -1,16 +1,13 @@ -use std::collections::HashMap; - -use self::{artifact::BrilligArtifact, brillig_gen::BrilligGen}; - -pub(crate) mod artifact; -pub(crate) mod binary; pub(crate) mod brillig_gen; -pub(crate) mod memory; +pub(crate) mod brillig_ir; +use self::{brillig_gen::convert_ssa_function, brillig_ir::artifact::BrilligArtifact}; use crate::ssa_refactor::{ ir::function::{Function, FunctionId, RuntimeType}, ssa_gen::Ssa, }; +use std::collections::HashMap; + /// Context structure for the brillig pass. /// It stores brillig-related data required for brillig generation. #[derive(Default)] @@ -22,7 +19,7 @@ pub struct Brillig { impl Brillig { /// Compiles a function into brillig and store the compilation artifacts pub(crate) fn compile(&mut self, func: &Function) { - let obj = BrilligGen::compile(func); + let obj = convert_ssa_function(func); self.ssa_function_to_brillig.insert(func.id(), obj); } } diff --git a/crates/noirc_evaluator/src/ssa/ssa_gen.rs b/crates/noirc_evaluator/src/ssa/ssa_gen.rs index 31817b0bded..082758468a6 100644 --- a/crates/noirc_evaluator/src/ssa/ssa_gen.rs +++ b/crates/noirc_evaluator/src/ssa/ssa_gen.rs @@ -189,9 +189,7 @@ impl IrGenerator { let function_node_id = self.context.get_or_create_opcode_node_id(opcode); Ok(Value::Node(function_node_id)) } - Definition::Oracle(_, _) => { - unimplemented!("oracles not supported by deprecated SSA") - } + Definition::Oracle(_) => unimplemented!("oracles not supported by deprecated SSA"), } } } @@ -499,8 +497,8 @@ impl IrGenerator { match expr { Expression::Ident(ident) => self.ssa_gen_identifier(ident), Expression::Binary(binary) => { - // Note: we disallows structs/tuples in infix expressions. - // The type checker currently disallows this as well but not if they come from generic type + // Note: we disallow structs/tuples in infix expressions. + // The type checker currently disallows this as well but not if they come from a generic type // We could allow some in the future, e.g. struct == struct let lhs = self.ssa_gen_expression(&binary.lhs)?.to_node_ids(); let rhs = self.ssa_gen_expression(&binary.rhs)?.to_node_ids(); diff --git a/crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/acir_variable.rs b/crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/acir_variable.rs index 27cddaac6cb..7b9ac3a720c 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/acir_variable.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/acir_gen/acir_ir/acir_variable.rs @@ -17,7 +17,7 @@ use acvm::{ use iter_extended::vecmap; use std::{borrow::Cow, hash::Hash}; -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] /// High level Type descriptor for Variables. /// /// One can think of Expression/Witness/Const @@ -27,30 +27,40 @@ use std::{borrow::Cow, hash::Hash}; /// We could store this information when we do a range constraint /// but this information is readily available by the caller so /// we allow the user to pass it in. -pub(crate) struct AcirType(NumericType); +pub(crate) enum AcirType { + NumericType(NumericType), + Array(Vec, usize), +} impl AcirType { pub(crate) fn new(typ: NumericType) -> Self { - Self(typ) + Self::NumericType(typ) } /// Returns the bit size of the underlying type pub(crate) fn bit_size(&self) -> u32 { - match self.0 { - NumericType::Signed { bit_size } => bit_size, - NumericType::Unsigned { bit_size } => bit_size, - NumericType::NativeField => FieldElement::max_num_bits(), + match self { + AcirType::NumericType(numeric_type) => match numeric_type { + NumericType::Signed { bit_size } => *bit_size, + NumericType::Unsigned { bit_size } => *bit_size, + NumericType::NativeField => FieldElement::max_num_bits(), + }, + AcirType::Array(_, _) => unreachable!("cannot fetch bit size of array type"), } } /// Returns a boolean type fn boolean() -> Self { - AcirType(NumericType::Unsigned { bit_size: 1 }) + AcirType::NumericType(NumericType::Unsigned { bit_size: 1 }) } /// True if type is signed pub(crate) fn is_signed(&self) -> bool { - matches!(self.0, NumericType::Signed { .. }) + let numeric_type = match self { + AcirType::NumericType(numeric_type) => numeric_type, + AcirType::Array(_, _) => return false, + }; + matches!(numeric_type, NumericType::Signed { .. }) } } @@ -63,7 +73,11 @@ impl From for AcirType { impl<'a> From<&'a SsaType> for AcirType { fn from(value: &SsaType) -> Self { match value { - SsaType::Numeric(numeric_type) => AcirType(*numeric_type), + SsaType::Numeric(numeric_type) => AcirType::NumericType(*numeric_type), + SsaType::Array(elements, size) => { + let elements = elements.iter().map(|e| e.into()).collect(); + AcirType::Array(elements, *size) + } _ => unreachable!("The type {value} cannot be represented in ACIR"), } } @@ -165,7 +179,7 @@ impl AcirContext { rhs: AcirVar, typ: AcirType, ) -> Result { - let inputs = vec![AcirValue::Var(lhs, typ), AcirValue::Var(rhs, typ)]; + let inputs = vec![AcirValue::Var(lhs, typ.clone()), AcirValue::Var(rhs, typ)]; let outputs = self.black_box_function(BlackBoxFunc::XOR, inputs)?; Ok(outputs[0]) } @@ -177,7 +191,7 @@ impl AcirContext { rhs: AcirVar, typ: AcirType, ) -> Result { - let inputs = vec![AcirValue::Var(lhs, typ), AcirValue::Var(rhs, typ)]; + let inputs = vec![AcirValue::Var(lhs, typ.clone()), AcirValue::Var(rhs, typ)]; let outputs = self.black_box_function(BlackBoxFunc::AND, inputs)?; Ok(outputs[0]) } @@ -204,7 +218,7 @@ impl AcirContext { let max = self.add_constant(FieldElement::from((1_u128 << bit_size) - 1)); let a = self.sub_var(max, lhs)?; let b = self.sub_var(max, rhs)?; - let inputs = vec![AcirValue::Var(a, typ), AcirValue::Var(b, typ)]; + let inputs = vec![AcirValue::Var(a, typ.clone()), AcirValue::Var(b, typ)]; let outputs = self.black_box_function(BlackBoxFunc::AND, inputs)?; self.sub_var(max, outputs[0]) } @@ -240,7 +254,13 @@ impl AcirContext { rhs: AcirVar, typ: AcirType, ) -> Result { - match typ.0 { + let numeric_type = match typ { + AcirType::NumericType(numeric_type) => numeric_type, + AcirType::Array(_, _) => { + todo!("cannot divide arrays. This should have been caught by the frontend") + } + }; + match numeric_type { NumericType::NativeField => { let inv_rhs = self.inv_var(rhs)?; self.mul_var(lhs, inv_rhs) @@ -609,7 +629,7 @@ impl AcirContext { let mut limb_vars = vecmap(limbs, |witness| { let witness = self.add_data(AcirVarData::Witness(witness)); - AcirValue::Var(witness, result_element_type) + AcirValue::Var(witness, result_element_type.clone()) }); if endian == Endian::Big { @@ -623,7 +643,7 @@ impl AcirContext { let limb_count_with_padding = max_decomposable_bits / bit_size; let zero = self.add_constant(FieldElement::zero()); while limb_vars.len() < limb_count_with_padding as usize { - limb_vars.push(AcirValue::Var(zero, result_element_type)); + limb_vars.push(AcirValue::Var(zero, result_element_type.clone())); } Ok(vec![AcirValue::Array(limb_vars.into())]) @@ -695,19 +715,63 @@ impl AcirContext { pub(crate) fn brillig( &mut self, code: Vec, - inputs: Vec, - output_len: usize, - ) -> Vec { - let b_inputs = - vecmap(inputs, |i| BrilligInputs::Single(self.vars[&i].to_expression().into_owned())); - let outputs = vecmap(0..output_len, |_| self.acir_ir.next_witness_index()); - let outputs_var = - vecmap(&outputs, |witness_index| self.add_data(AcirVarData::Witness(*witness_index))); - let b_outputs = vecmap(outputs, BrilligOutputs::Simple); + inputs: Vec, + outputs: Vec, + ) -> Vec { + let b_inputs = vecmap(inputs, |i| match i { + AcirValue::Var(var, _) => { + BrilligInputs::Single(self.vars[&var].to_expression().into_owned()) + } + AcirValue::Array(vars) => { + let mut var_expressions: Vec = Vec::new(); + for var in vars { + self.brillig_array_input(&mut var_expressions, var); + } + BrilligInputs::Array(var_expressions) + } + }); + + let mut b_outputs = Vec::new(); + let outputs_var = vecmap(outputs, |output| match output { + AcirType::NumericType(_) => { + let witness_index = self.acir_ir.next_witness_index(); + b_outputs.push(BrilligOutputs::Simple(witness_index)); + let var = self.add_data(AcirVarData::Witness(witness_index)); + AcirValue::Var(var, output.clone()) + } + AcirType::Array(element_types, size) => { + let mut witnesses = Vec::new(); + let mut array_values = im::Vector::new(); + for _ in 0..size { + for element_type in &element_types { + let witness_index = self.acir_ir.next_witness_index(); + witnesses.push(witness_index); + let var = self.add_data(AcirVarData::Witness(witness_index)); + array_values.push_back(AcirValue::Var(var, element_type.clone())); + } + } + b_outputs.push(BrilligOutputs::Array(witnesses)); + AcirValue::Array(array_values) + } + }); + self.acir_ir.brillig(code, b_inputs, b_outputs); outputs_var } + + fn brillig_array_input(&self, var_expressions: &mut Vec, input: AcirValue) { + match input { + AcirValue::Var(var, _) => { + var_expressions.push(self.vars[var].to_expression().into_owned()); + } + AcirValue::Array(vars) => { + for var in vars { + self.brillig_array_input(var_expressions, var); + } + } + } + } } /// Enum representing the possible values that a diff --git a/crates/noirc_evaluator/src/ssa_refactor/acir_gen/mod.rs b/crates/noirc_evaluator/src/ssa_refactor/acir_gen/mod.rs index 68d80a36dec..9e61d579e48 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/acir_gen/mod.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/acir_gen/mod.rs @@ -2,6 +2,8 @@ use std::collections::HashMap; +use crate::brillig::{brillig_gen::create_entry_point_function, Brillig}; + use self::acir_ir::{ acir_variable::{AcirContext, AcirType, AcirVar}, errors::AcirGenError, @@ -19,7 +21,6 @@ use super::{ }, ssa_gen::Ssa, }; -use crate::brillig::{artifact::BrilligArtifact, Brillig}; use acvm::FieldElement; use iter_extended::vecmap; @@ -179,17 +180,19 @@ impl Context { "expected an intrinsic/brillig call, but found {func:?}. All ACIR methods should be inlined" ), RuntimeType::Brillig => { - let inputs:Vec = arguments - .iter() - .flat_map(|arg| self.convert_value(*arg, dfg).flatten()) - .map(|(var, _typ)| var) - .collect(); + let inputs = vecmap(arguments, |arg| self.convert_value(*arg, dfg)); + // Generate the brillig code of the function - let code = BrilligArtifact::default().link(&brillig[*id]); - let outputs = self.acir_context.brillig(code, inputs, result_ids.len()); - for (result, output) in result_ids.iter().zip(outputs) { - let result_acir_type = dfg.type_of_value(*result).into(); - self.ssa_values.insert(*result, AcirValue::Var(output, result_acir_type)); + let code = create_entry_point_function(arguments.len()).link(&brillig[*id]); + + let outputs: Vec = vecmap(result_ids, |result_id| dfg.type_of_value(*result_id).into()); + + let output_values = self.acir_context.brillig(code, inputs, outputs); + // Compiler sanity check + assert_eq!(result_ids.len(), output_values.len(), "ICE: The number of Brillig output values should match the result ids in SSA"); + + for result in result_ids.iter().zip(output_values) { + self.ssa_values.insert(*result.0, result.1); } } } @@ -211,6 +214,9 @@ impl Context { self.ssa_values.insert(*result, output); } } + Value::ForeignFunction(_) => unreachable!( + "All `oracle` methods should be wrapped in an unconstrained fn" + ), _ => unreachable!("expected calling a function"), } } @@ -309,7 +315,6 @@ impl Context { // The return value may or may not be an array reference. Calling `flatten_value_list` // will expand the array if there is one. let return_acir_vars = self.flatten_value_list(return_values, dfg); - for acir_var in return_acir_vars { self.acir_context.return_var(acir_var); } @@ -345,6 +350,9 @@ impl Context { } Value::Intrinsic(..) => todo!(), Value::Function(..) => unreachable!("ICE: All functions should have been inlined"), + Value::ForeignFunction(_) => unimplemented!( + "Oracle calls directly in constrained functions are not yet available." + ), Value::Instruction { .. } | Value::Param { .. } => { unreachable!("ICE: Should have been in cache {value_id} {value:?}") } diff --git a/crates/noirc_evaluator/src/ssa_refactor/ir/dfg.rs b/crates/noirc_evaluator/src/ssa_refactor/ir/dfg.rs index 6833e433cb6..6ba3372c005 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ir/dfg.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ir/dfg.rs @@ -54,6 +54,11 @@ pub(crate) struct DataFlowGraph { /// represented by only 1 ValueId within this function. intrinsics: HashMap, + /// Contains each foreign function that has been imported into the current function. + /// This map is used to ensure that the ValueId for any given foreign functôn is always + /// represented by only 1 ValueId within this function. + foreign_functions: HashMap, + /// Function signatures of external methods signatures: DenseMap, @@ -203,6 +208,14 @@ impl DataFlowGraph { self.values.insert(Value::Function(function)) } + /// Gets or creates a ValueId for the given FunctionId. + pub(crate) fn import_foreign_function(&mut self, function: &str) -> ValueId { + if let Some(existing) = self.foreign_functions.get(function) { + return *existing; + } + self.values.insert(Value::ForeignFunction(function.to_owned())) + } + /// Gets or creates a ValueId for the given Intrinsic. pub(crate) fn import_intrinsic(&mut self, intrinsic: Intrinsic) -> ValueId { if let Some(existing) = self.intrinsics.get(&intrinsic) { diff --git a/crates/noirc_evaluator/src/ssa_refactor/ir/function.rs b/crates/noirc_evaluator/src/ssa_refactor/ir/function.rs index 2bb1846c94b..f5be19dd88e 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ir/function.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ir/function.rs @@ -6,7 +6,7 @@ use super::map::Id; use super::types::Type; use super::value::ValueId; -#[derive(Clone, Copy, PartialEq, Eq, Debug)] +#[derive(Clone, PartialEq, Eq, Debug)] pub(crate) enum RuntimeType { // A noir function, to be compiled in ACIR and executed by ACVM Acir, @@ -59,7 +59,7 @@ impl Function { /// Runtime type of the function. pub(crate) fn runtime(&self) -> RuntimeType { - self.runtime + self.runtime.clone() } /// Set runtime type of the function. diff --git a/crates/noirc_evaluator/src/ssa_refactor/ir/map.rs b/crates/noirc_evaluator/src/ssa_refactor/ir/map.rs index b931c061b22..e7f9d812de3 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ir/map.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ir/map.rs @@ -99,6 +99,12 @@ impl std::fmt::Display for Id { } } +impl std::fmt::Display for Id { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "f{}", self.index) + } +} + /// A DenseMap is a Vec wrapper where each element corresponds /// to a unique ID that can be used to access the element. No direct /// access to indices is provided. Since IDs must be stable and correspond diff --git a/crates/noirc_evaluator/src/ssa_refactor/ir/printer.rs b/crates/noirc_evaluator/src/ssa_refactor/ir/printer.rs index a8dceb6a8b4..071f1a16029 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ir/printer.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ir/printer.rs @@ -72,7 +72,9 @@ fn value(function: &Function, id: ValueId) -> String { let elements = vecmap(array, |element| value(function, *element)); format!("[{}]", elements.join(", ")) } - Value::Param { .. } | Value::Instruction { .. } => id.to_string(), + Value::Param { .. } | Value::Instruction { .. } | Value::ForeignFunction(_) => { + id.to_string() + } } } diff --git a/crates/noirc_evaluator/src/ssa_refactor/ir/value.rs b/crates/noirc_evaluator/src/ssa_refactor/ir/value.rs index 30468a0a669..fca871ae895 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ir/value.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ir/value.rs @@ -50,6 +50,11 @@ pub(crate) enum Value { /// An Intrinsic is a special kind of builtin function that may be handled internally /// or optimized into a special form. Intrinsic(Intrinsic), + + /// This Value refers to an external function in the IR. + /// ForeignFunction's always have the type Type::Function and have simlar semantics to Function, + /// other than generating different backend operations and being only accessible through Brillig. + ForeignFunction(String), } impl Value { @@ -62,6 +67,7 @@ impl Value { Value::Array { element_type, array } => Type::Array(element_type.clone(), array.len()), Value::Function { .. } => Type::Function, Value::Intrinsic { .. } => Type::Function, + Value::ForeignFunction { .. } => Type::Function, } } } diff --git a/crates/noirc_evaluator/src/ssa_refactor/opt/inlining.rs b/crates/noirc_evaluator/src/ssa_refactor/opt/inlining.rs index 80e491e79f1..75b1047167b 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/opt/inlining.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/opt/inlining.rs @@ -207,6 +207,9 @@ impl<'function> PerFunctionContext<'function> { } Value::Function(function) => self.context.builder.import_function(*function), Value::Intrinsic(intrinsic) => self.context.builder.import_intrinsic_id(*intrinsic), + Value::ForeignFunction(function) => { + self.context.builder.import_foreign_function(function) + } Value::Array { array, element_type } => { let elements = array.iter().map(|value| self.translate_value(*value)).collect(); self.context.builder.array_constant(elements, element_type.clone()) diff --git a/crates/noirc_evaluator/src/ssa_refactor/ssa_builder/mod.rs b/crates/noirc_evaluator/src/ssa_refactor/ssa_builder/mod.rs index 49e68dad1f2..d68957fa67d 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ssa_builder/mod.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ssa_builder/mod.rs @@ -229,7 +229,7 @@ impl FunctionBuilder { self.insert_instruction(Instruction::Constrain(boolean), None); } - /// Insert a call instruction a the end of the current block and return + /// Insert a call instruction at the end of the current block and return /// the results of the call. pub(crate) fn insert_call( &mut self, @@ -302,6 +302,12 @@ impl FunctionBuilder { self.current_function.dfg.import_function(function) } + /// Returns a ValueId pointing to the given oracle/foreign function or imports the oracle + /// into the current function if it was not already, and returns that ID. + pub(crate) fn import_foreign_function(&mut self, function: &str) -> ValueId { + self.current_function.dfg.import_foreign_function(function) + } + /// Retrieve a value reference to the given intrinsic operation. /// Returns None if there is no intrinsic matching the given name. pub(crate) fn import_intrinsic(&mut self, name: &str) -> Option { diff --git a/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/mod.rs b/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/mod.rs index 8951741639b..0dc003dd9de 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/mod.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/mod.rs @@ -92,16 +92,18 @@ impl<'a> FunctionContext<'a> { self.codegen_expression(expr).into_leaf().eval(self) } + /// Codegen for identifiers fn codegen_ident(&mut self, ident: &ast::Ident) -> Values { match &ident.definition { ast::Definition::Local(id) => self.lookup(*id).map(|value| value.eval(self).into()), ast::Definition::Function(id) => self.get_or_queue_function(*id), - ast::Definition::Builtin(name) - | ast::Definition::LowLevel(name) - | ast::Definition::Oracle(name, _) => match self.builder.import_intrinsic(name) { - Some(builtin) => builtin.into(), - None => panic!("No builtin function named '{name}' found"), - }, + ast::Definition::Oracle(name) => self.builder.import_foreign_function(name).into(), + ast::Definition::Builtin(name) | ast::Definition::LowLevel(name) => { + match self.builder.import_intrinsic(name) { + Some(builtin) => builtin.into(), + None => panic!("No builtin function named '{name}' found"), + } + } } } @@ -337,14 +339,13 @@ impl<'a> FunctionContext<'a> { /// Generate SSA for a function call. Note that calls to built-in functions /// and intrinsics are also represented by the function call instruction. fn codegen_call(&mut self, call: &ast::Call) -> Values { - let function = self.codegen_non_tuple_expression(&call.func); - let arguments = call .arguments .iter() .flat_map(|argument| self.codegen_expression(argument).into_value_list(self)) .collect(); + let function = self.codegen_non_tuple_expression(&call.func); self.insert_call(function, arguments, &call.return_type) } diff --git a/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/value.rs b/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/value.rs index 2a38e3835d6..c50abb9ca30 100644 --- a/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/value.rs +++ b/crates/noirc_evaluator/src/ssa_refactor/ssa_gen/value.rs @@ -58,7 +58,7 @@ impl Value { /// A tree of values. /// /// Compared to Value alone, the addition of being able to represent structs/tuples as -/// a Tree::Branch means this type can hold any kind of value an frontend expression may return. +/// a Tree::Branch means this type can hold any kind of value a frontend expression may return. /// This is why it is used as the return type for every codegen_* function in ssa_gen/mod.rs. pub(super) type Values = Tree; diff --git a/crates/noirc_frontend/src/hir/resolution/resolver.rs b/crates/noirc_frontend/src/hir/resolution/resolver.rs index 67d0e2cf2a4..883b323ce66 100644 --- a/crates/noirc_frontend/src/hir/resolution/resolver.rs +++ b/crates/noirc_frontend/src/hir/resolution/resolver.rs @@ -305,7 +305,6 @@ impl<'a> Resolver<'a> { fn intern_function(&mut self, func: NoirFunction, id: FuncId) -> (HirFunction, FuncMeta) { let func_meta = self.extract_meta(&func, id); - let hir_func = match func.kind { FunctionKind::Builtin | FunctionKind::LowLevel | FunctionKind::Oracle => { HirFunction::empty() diff --git a/crates/noirc_frontend/src/monomorphization/ast.rs b/crates/noirc_frontend/src/monomorphization/ast.rs index 61541c85fc0..aaaf7c5bb2f 100644 --- a/crates/noirc_frontend/src/monomorphization/ast.rs +++ b/crates/noirc_frontend/src/monomorphization/ast.rs @@ -45,7 +45,7 @@ pub enum Definition { Builtin(String), LowLevel(String), // used as a foreign/externally defined unconstrained function - Oracle(String, FuncId), + Oracle(String), } /// ID of a local definition, e.g. from a let binding or diff --git a/crates/noirc_frontend/src/monomorphization/mod.rs b/crates/noirc_frontend/src/monomorphization/mod.rs index 0f8fb0ea059..8c588acbf90 100644 --- a/crates/noirc_frontend/src/monomorphization/mod.rs +++ b/crates/noirc_frontend/src/monomorphization/mod.rs @@ -153,13 +153,11 @@ impl<'interner> Monomorphizer<'interner> { let id = self.queue_function(id, expr_id, typ); Definition::Function(id) } - FunctionKind::Oracle => { let attr = meta.attributes.expect("Oracle function must have an oracle attribute"); - let id = self.queue_function(id, expr_id, typ); match attr { - Attribute::Oracle(name) => Definition::Oracle(name, id), + Attribute::Oracle(name) => Definition::Oracle(name), _ => unreachable!("Oracle function must have an oracle attribute"), } } diff --git a/crates/noirc_frontend/src/monomorphization/printer.rs b/crates/noirc_frontend/src/monomorphization/printer.rs index 825a800801c..39c6db8734b 100644 --- a/crates/noirc_frontend/src/monomorphization/printer.rs +++ b/crates/noirc_frontend/src/monomorphization/printer.rs @@ -273,7 +273,7 @@ impl Display for Definition { Definition::Function(id) => write!(f, "f{}", id.0), Definition::Builtin(name) => write!(f, "{name}"), Definition::LowLevel(name) => write!(f, "{name}"), - Definition::Oracle(name, _) => write!(f, "{name}"), + Definition::Oracle(name) => write!(f, "{name}"), } } }