#
tokens: 49753/50000 11/1140 files (page 20/103)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 20 of 103. Use http://codebase.md/cyfrin/aderyn?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .cargo
│   └── config.toml
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
│   ├── images
│   │   ├── aderyn_logo.png
│   │   ├── poweredbycyfrinblack.png
│   │   └── poweredbycyfrinblue.png
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.md
│   │   ├── false_positive_issue.md
│   │   └── feature_request.md
│   └── workflows
│       ├── cargo.yml
│       ├── dependencies.yml
│       ├── release.yml
│       ├── reports.yml
│       └── toml.yml
├── .gitignore
├── .gitmodules
├── .vscode
│   └── settings.json
├── aderyn
│   ├── Cargo.toml
│   ├── oranda.json
│   ├── README.md
│   ├── src
│   │   ├── birdsong.rs
│   │   ├── completions.rs
│   │   ├── lib.rs
│   │   ├── lsp.rs
│   │   ├── main.rs
│   │   ├── mcp.rs
│   │   └── panic.rs
│   └── templates
│       └── aderyn.toml
├── aderyn_core
│   ├── .gitignore
│   ├── Cargo.toml
│   ├── README.md
│   ├── src
│   │   ├── ast
│   │   │   ├── ast_nodes.rs
│   │   │   ├── ast.rs
│   │   │   ├── impls
│   │   │   │   ├── ctx
│   │   │   │   │   ├── utils.rs
│   │   │   │   │   └── workspace.rs
│   │   │   │   ├── ctx.rs
│   │   │   │   ├── disp
│   │   │   │   │   ├── blocks.rs
│   │   │   │   │   ├── contracts.rs
│   │   │   │   │   ├── enumerations.rs
│   │   │   │   │   ├── errors.rs
│   │   │   │   │   ├── events.rs
│   │   │   │   │   ├── expressions.rs
│   │   │   │   │   ├── functions.rs
│   │   │   │   │   ├── identifiers.rs
│   │   │   │   │   ├── literals.rs
│   │   │   │   │   ├── modifiers.rs
│   │   │   │   │   ├── statements.rs
│   │   │   │   │   ├── structures.rs
│   │   │   │   │   ├── types.rs
│   │   │   │   │   ├── user_defined_value_types.rs
│   │   │   │   │   ├── using_for_directives.rs
│   │   │   │   │   └── variables.rs
│   │   │   │   ├── disp.rs
│   │   │   │   ├── node
│   │   │   │   │   ├── blocks.rs
│   │   │   │   │   ├── contracts.rs
│   │   │   │   │   ├── documentation.rs
│   │   │   │   │   ├── enumerations.rs
│   │   │   │   │   ├── errors.rs
│   │   │   │   │   ├── events.rs
│   │   │   │   │   ├── expressions.rs
│   │   │   │   │   ├── functions.rs
│   │   │   │   │   ├── identifiers.rs
│   │   │   │   │   ├── import_directives.rs
│   │   │   │   │   ├── literals.rs
│   │   │   │   │   ├── modifiers.rs
│   │   │   │   │   ├── pragma_directives.rs
│   │   │   │   │   ├── source_units.rs
│   │   │   │   │   ├── statements.rs
│   │   │   │   │   ├── structures.rs
│   │   │   │   │   ├── types.rs
│   │   │   │   │   ├── user_defined_value_types.rs
│   │   │   │   │   ├── using_for_directives.rs
│   │   │   │   │   └── variables.rs
│   │   │   │   ├── node.rs
│   │   │   │   ├── own
│   │   │   │   │   ├── hashing.rs
│   │   │   │   │   ├── node_id.rs
│   │   │   │   │   ├── source_units.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   └── own.rs
│   │   │   ├── impls.rs
│   │   │   ├── macros.rs
│   │   │   ├── magic.rs
│   │   │   ├── node_type.rs
│   │   │   └── yul.rs
│   │   ├── ast.rs
│   │   ├── audit
│   │   │   ├── attack_surface.rs
│   │   │   ├── auditor.rs
│   │   │   ├── entrypoint.rs
│   │   │   └── public_functions_no_sender.rs
│   │   ├── audit.rs
│   │   ├── context
│   │   │   ├── browser
│   │   │   │   ├── ancestral_line.rs
│   │   │   │   ├── closest_ancestor.rs
│   │   │   │   ├── external_calls.rs
│   │   │   │   ├── extractor.rs
│   │   │   │   ├── immediate_children.rs
│   │   │   │   ├── location.rs
│   │   │   │   ├── macros.rs
│   │   │   │   ├── parent.rs
│   │   │   │   ├── peek_over.rs
│   │   │   │   ├── peek_under.rs
│   │   │   │   ├── peek.rs
│   │   │   │   ├── siblings.rs
│   │   │   │   ├── sort_nodes.rs
│   │   │   │   └── storage_vars.rs
│   │   │   ├── browser.rs
│   │   │   ├── capturable.rs
│   │   │   ├── flow
│   │   │   │   ├── display.rs
│   │   │   │   ├── error.rs
│   │   │   │   ├── kind.rs
│   │   │   │   ├── primitives.rs
│   │   │   │   ├── reducibles.rs
│   │   │   │   ├── tests.rs
│   │   │   │   ├── utils.rs
│   │   │   │   ├── visualizer.rs
│   │   │   │   └── voids.rs
│   │   │   ├── flow.rs
│   │   │   ├── graph
│   │   │   │   ├── callgraph
│   │   │   │   │   ├── legacy.rs
│   │   │   │   │   ├── new.rs
│   │   │   │   │   ├── tests.rs
│   │   │   │   │   ├── utils.rs
│   │   │   │   │   └── visit.rs
│   │   │   │   ├── callgraph.rs
│   │   │   │   ├── preprocess
│   │   │   │   │   ├── legacy.rs
│   │   │   │   │   └── new.rs
│   │   │   │   ├── preprocess.rs
│   │   │   │   ├── traits.rs
│   │   │   │   └── utils.rs
│   │   │   ├── graph.rs
│   │   │   ├── macros.rs
│   │   │   ├── mcp
│   │   │   │   ├── callgraph
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── callgraph.rs
│   │   │   │   ├── contract_surface
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── util.rs
│   │   │   │   ├── contract_surface.rs
│   │   │   │   ├── list_contracts
│   │   │   │   │   ├── render.rs
│   │   │   │   │   └── tool.rs
│   │   │   │   ├── list_contracts.rs
│   │   │   │   ├── node_finder
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── node_finder.rs
│   │   │   │   ├── node_summarizer
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── node_summarizer.rs
│   │   │   │   ├── project_overview
│   │   │   │   │   ├── render.rs
│   │   │   │   │   └── tool.rs
│   │   │   │   ├── project_overview.rs
│   │   │   │   ├── tool_guide
│   │   │   │   │   └── tool.rs
│   │   │   │   └── tool_guide.rs
│   │   │   ├── mcp.rs
│   │   │   ├── router
│   │   │   │   ├── external_calls.rs
│   │   │   │   ├── internal_calls.rs
│   │   │   │   ├── modifier_calls.rs
│   │   │   │   └── tests.rs
│   │   │   ├── router.rs
│   │   │   └── workspace.rs
│   │   ├── context.rs
│   │   ├── detect
│   │   │   ├── detector.rs
│   │   │   ├── entrypoint.rs
│   │   │   ├── helpers.rs
│   │   │   ├── high
│   │   │   │   ├── _template.rs
│   │   │   │   ├── abi_encode_packed_hash_collision.rs
│   │   │   │   ├── arbitrary_transfer_from.rs
│   │   │   │   ├── const_func_changes_state.rs
│   │   │   │   ├── contract_locks_ether.rs
│   │   │   │   ├── dangerous_unary_operator.rs
│   │   │   │   ├── delegate_call_unchecked_address.rs
│   │   │   │   ├── delete_nested_mapping.rs
│   │   │   │   ├── dynamic_array_length_assignment.rs
│   │   │   │   ├── enumerable_loop_removal.rs
│   │   │   │   ├── eth_send_unchecked_address.rs
│   │   │   │   ├── experimental_encoder.rs
│   │   │   │   ├── function_selector_collision.rs
│   │   │   │   ├── incorrect_caret_operator.rs
│   │   │   │   ├── incorrect_erc20_interface.rs
│   │   │   │   ├── incorrect_erc721_interface.rs
│   │   │   │   ├── incorrect_shift_order.rs
│   │   │   │   ├── misused_boolean.rs
│   │   │   │   ├── msg_value_in_loops.rs
│   │   │   │   ├── multiple_constructors.rs
│   │   │   │   ├── nested_struct_in_mapping.rs
│   │   │   │   ├── out_of_order_retryable.rs
│   │   │   │   ├── pre_declared_variable_usage.rs
│   │   │   │   ├── reentrancy_state_change.rs
│   │   │   │   ├── reused_contract_name.rs
│   │   │   │   ├── rtlo.rs
│   │   │   │   ├── selfdestruct.rs
│   │   │   │   ├── signed_integer_storage_array.rs
│   │   │   │   ├── state_variable_shadowing.rs
│   │   │   │   ├── storage_array_memory_edit.rs
│   │   │   │   ├── strict_equality_contract_balance.rs
│   │   │   │   ├── tautological_compare.rs
│   │   │   │   ├── tautology_or_contradiction.rs
│   │   │   │   ├── tx_origin_used_for_auth.rs
│   │   │   │   ├── unchecked_low_level_call.rs
│   │   │   │   ├── unchecked_send.rs
│   │   │   │   ├── unprotected_initializer.rs
│   │   │   │   ├── unsafe_casting.rs
│   │   │   │   ├── weak_randomness.rs
│   │   │   │   └── yul_return.rs
│   │   │   ├── high.rs
│   │   │   ├── low
│   │   │   │   ├── _template.rs
│   │   │   │   ├── assert_state_change.rs
│   │   │   │   ├── block_timestamp_deadline.rs
│   │   │   │   ├── boolean_equality.rs
│   │   │   │   ├── builtin_symbol_shadowing.rs
│   │   │   │   ├── centralization_risk.rs
│   │   │   │   ├── constant_function_contains_assembly.rs
│   │   │   │   ├── costly_loop.rs
│   │   │   │   ├── dead_code.rs
│   │   │   │   ├── delegatecall_in_loop.rs
│   │   │   │   ├── deprecated_oz_function.rs
│   │   │   │   ├── division_before_multiplication.rs
│   │   │   │   ├── ecrecover.rs
│   │   │   │   ├── empty_block.rs
│   │   │   │   ├── empty_require_revert.rs
│   │   │   │   ├── function_initializing_state.rs
│   │   │   │   ├── function_pointer_in_constructor.rs
│   │   │   │   ├── inconsistent_type_names.rs
│   │   │   │   ├── incorrect_modifier.rs
│   │   │   │   ├── internal_function_used_once.rs
│   │   │   │   ├── large_numeric_literal.rs
│   │   │   │   ├── literal_instead_of_constant.rs
│   │   │   │   ├── local_variable_shadowing.rs
│   │   │   │   ├── missing_inheritance.rs
│   │   │   │   ├── modifier_used_only_once.rs
│   │   │   │   ├── multiple_placeholders.rs
│   │   │   │   ├── non_reentrant_not_first.rs
│   │   │   │   ├── push_0_opcode.rs
│   │   │   │   ├── redundant_statement.rs
│   │   │   │   ├── require_revert_in_loop.rs
│   │   │   │   ├── return_bomb.rs
│   │   │   │   ├── solmate_safe_transfer_lib.rs
│   │   │   │   ├── state_change_without_event.rs
│   │   │   │   ├── state_no_address_check.rs
│   │   │   │   ├── state_variable_could_be_constant.rs
│   │   │   │   ├── state_variable_could_be_immutable.rs
│   │   │   │   ├── state_variable_read_external.rs
│   │   │   │   ├── storage_array_length_not_cached.rs
│   │   │   │   ├── todo.rs
│   │   │   │   ├── unchecked_return.rs
│   │   │   │   ├── uninitialized_local_variable.rs
│   │   │   │   ├── unsafe_erc20_operation.rs
│   │   │   │   ├── unsafe_oz_erc721_mint.rs
│   │   │   │   ├── unspecific_solidity_pragma.rs
│   │   │   │   ├── unused_error.rs
│   │   │   │   ├── unused_import.rs
│   │   │   │   ├── unused_public_function.rs
│   │   │   │   ├── unused_state_variable.rs
│   │   │   │   └── void_constructor.rs
│   │   │   ├── low.rs
│   │   │   └── test_utils.rs
│   │   ├── detect.rs
│   │   ├── lib.rs
│   │   ├── stats
│   │   │   ├── cloc.rs
│   │   │   ├── dbg_tips.txt
│   │   │   ├── ignore.rs
│   │   │   ├── token.rs
│   │   │   └── util.rs
│   │   ├── stats.rs
│   │   ├── test_utils
│   │   │   └── load_source_unit.rs
│   │   ├── test_utils.rs
│   │   ├── visitor
│   │   │   ├── ast_visitor.rs
│   │   │   ├── macros.rs
│   │   │   └── workspace_visitor.rs
│   │   └── visitor.rs
│   ├── templates
│   │   └── mcp-tool-response
│   │       ├── callgraph.md
│   │       ├── contract_surface.md
│   │       ├── list_contracts.md
│   │       ├── node_finder_get_all.md
│   │       ├── node_finder_grep.md
│   │       ├── node_finder_search.md
│   │       ├── node_summarizer.md
│   │       ├── project_overview.md
│   │       └── tool_guide.md
│   └── tests
│       ├── common
│       │   ├── ancestral_line.rs
│       │   ├── closest_ancestor.rs
│       │   ├── immediate_children.rs
│       │   ├── immediate_parent.rs
│       │   ├── mod.rs
│       │   ├── new_ast_nodes.rs
│       │   ├── peek_over.rs
│       │   └── sibling.rs
│       └── traversal.rs
├── aderyn_driver
│   ├── .gitignore
│   ├── benches
│   │   └── detectors.rs
│   ├── Cargo.toml
│   ├── README.md
│   ├── src
│   │   ├── compile.rs
│   │   ├── config.rs
│   │   ├── display.rs
│   │   ├── driver.rs
│   │   ├── interface
│   │   │   ├── json.rs
│   │   │   ├── lsp.rs
│   │   │   ├── markdown.rs
│   │   │   ├── mod.rs
│   │   │   ├── sarif.rs
│   │   │   ├── tables.rs
│   │   │   └── util.rs
│   │   ├── lib.rs
│   │   ├── mcp.rs
│   │   ├── process.rs
│   │   └── runner.rs
│   └── tests
│       └── astgen.rs
├── bacon.toml
├── benchmarks
│   ├── aderyn
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── iteration_times.svg
│   │       │   └── pdf.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── iteration_times_small.svg
│   │       ├── iteration_times.svg
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── relative_iteration_times_small.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── SD.svg
│   │       └── typical.svg
│   ├── arbitrary-transfer-from
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── avoid-abi-encode-packed
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── block-timestamp-deadline
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── centralization-risk
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── constants-instead-of-literals
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── delegate-call-in-loop
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── deprecated-oz-functions
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── ecrecover
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── empty-block
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── hello_world
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── inconsistent-type-names
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── large-numeric-literal
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── non-reentrant-before-others
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── push-zero-opcode
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── report
│   │   └── index.html
│   ├── require-with-string
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── solmate-safe-transfer-lib
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unindexed-events
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unprotected-initializer
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unsafe-erc20-functions
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unsafe-oz-erc721-mint
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unspecific-solidity-pragma
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── useless-internal-function
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── useless-modifier
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── useless-public-function
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   └── zero-address-check
│       ├── base
│       │   ├── benchmark.json
│       │   ├── estimates.json
│       │   ├── sample.json
│       │   └── tukey.json
│       ├── change
│       │   └── estimates.json
│       ├── new
│       │   ├── benchmark.json
│       │   ├── estimates.json
│       │   ├── sample.json
│       │   └── tukey.json
│       └── report
│           ├── both
│           │   ├── pdf.svg
│           │   └── regression.svg
│           ├── change
│           │   ├── mean.svg
│           │   ├── median.svg
│           │   └── t-test.svg
│           ├── index.html
│           ├── MAD.svg
│           ├── mean.svg
│           ├── median.svg
│           ├── pdf_small.svg
│           ├── pdf.svg
│           ├── regression_small.svg
│           ├── regression.svg
│           ├── relative_pdf_small.svg
│           ├── relative_regression_small.svg
│           ├── SD.svg
│           ├── slope.svg
│           └── typical.svg
├── Cargo.lock
├── Cargo.toml
├── cli
│   ├── benchmarks.sh
│   └── reportgen.sh
├── CODEOWNERS
├── CONTRIBUTING.md
├── cyfrinup
│   ├── dynamic_script
│   └── why.md
├── deny.toml
├── dist-workspace.toml
├── funding.json
├── LICENSE
├── Makefile
├── package-lock.json
├── package.json
├── README.md
├── RELEASE_CHECKLIST.md
├── reports
│   ├── adhoc-sol-files-highs-only-report.json
│   ├── adhoc-sol-files-report.md
│   ├── ccip-functions-report.md
│   ├── empty_report.md
│   ├── hardhat-playground-report.md
│   ├── nft-report-icm.md
│   ├── nft-report.md
│   ├── prb-math-report.md
│   ├── report.json
│   ├── report.md
│   ├── report.sarif
│   ├── sablier-aderyn-toml-nested-root.md
│   ├── templegold-report.md
│   └── uniswap_profile.md
├── rust-toolchain.toml
├── rustfmt.toml
├── tests
│   ├── adhoc-sol-files
│   │   ├── aderyn.toml
│   │   ├── Counter.sol
│   │   ├── DemoASTNodes.sol
│   │   ├── Helper.sol
│   │   ├── InconsistentUints.sol
│   │   ├── inheritance
│   │   │   ├── ExtendedInheritance.sol
│   │   │   ├── IContractInheritance.sol
│   │   │   └── InheritanceBase.sol
│   │   ├── InternalFunctions.sol
│   │   ├── lib
│   │   │   └── ThisShouldBeExcluded.sol
│   │   ├── multiple-versions
│   │   │   ├── 0.4
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   ├── 0.5
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   ├── 0.6
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   ├── 0.7
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   └── 0.8
│   │   │       ├── A.sol
│   │   │       └── B.sol
│   │   ├── OnceModifierExample.sol
│   │   └── StateVariables.sol
│   ├── ast
│   │   ├── abstract_contract.json
│   │   ├── address_payable.json
│   │   ├── array_type_name.json
│   │   ├── ast-erc4626.json
│   │   ├── base_constructor_call.json
│   │   ├── bit_not.json
│   │   ├── call.json
│   │   ├── constructor.json
│   │   ├── contract_dep_order.json
│   │   ├── do_while.json
│   │   ├── documentation_1.json
│   │   ├── documentation_2.json
│   │   ├── documentation_3.json
│   │   ├── documentation_local_variable.json
│   │   ├── documentation_on_statements.json
│   │   ├── documentation_triple.json
│   │   ├── empty_block.json
│   │   ├── enum_value_declaration.json
│   │   ├── enum_value.json
│   │   ├── event_definition.json
│   │   ├── experimental_encoder_pragma.json
│   │   ├── fallback_and_reveice_ether.json
│   │   ├── fallback_payable.json
│   │   ├── fallback.json
│   │   ├── function_type.json
│   │   ├── function.json
│   │   ├── global_enum.json
│   │   ├── global_struct.json
│   │   ├── inheritance_specifier.json
│   │   ├── leave.json
│   │   ├── license.json
│   │   ├── long_type_name_binary_operation.json
│   │   ├── long_type_name_identifier.json
│   │   ├── loop.json
│   │   ├── mappings.json
│   │   ├── modifier_definition.json
│   │   ├── modifier_invocation.json
│   │   ├── mutability.json
│   │   ├── nested_functions.json
│   │   ├── non_utf8.json
│   │   ├── override.json
│   │   ├── placeholder_statement.json
│   │   ├── receive_ether.json
│   │   ├── short_type_name_ref.json
│   │   ├── short_type_name.json
│   │   ├── slot_offset.json
│   │   ├── smoke.json
│   │   ├── source_location.json
│   │   ├── string.json
│   │   ├── stringlit.json
│   │   ├── switch_default.json
│   │   ├── switch.json
│   │   ├── try_catch.json
│   │   ├── two_base_functions.json
│   │   ├── unicode.json
│   │   ├── used_errors.json
│   │   ├── userDefinedValueType.json
│   │   ├── using_for_directive.json
│   │   ├── var_access.json
│   │   └── yul_hex_literal.json
│   ├── contract-playground
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── test.yml
│   │   ├── .gitignore
│   │   ├── dot
│   │   │   └── .gitkeep
│   │   ├── foundry.toml
│   │   ├── README.md
│   │   ├── script
│   │   │   └── Counter.s.sol
│   │   ├── src
│   │   │   ├── AbstractContract.sol
│   │   │   ├── AderynIgnoreCustomDetectors.sol
│   │   │   ├── AdminContract.sol
│   │   │   ├── ArbitraryTransferFrom.sol
│   │   │   ├── AssemblyExample.sol
│   │   │   ├── AssertStateChange.sol
│   │   │   ├── auditor_mode
│   │   │   │   ├── ExternalCalls.sol
│   │   │   │   └── PublicFunctionsWithoutSenderCheck.sol
│   │   │   ├── BooleanEquality.sol
│   │   │   ├── BuiltinSymbolShadow.sol
│   │   │   ├── CacheArrayLength.sol
│   │   │   ├── CallGraphTests.sol
│   │   │   ├── Casting.sol
│   │   │   ├── cloc
│   │   │   │   ├── AnotherHeavilyCommentedContract.sol
│   │   │   │   ├── EmptyContractFile.sol
│   │   │   │   └── HeavilyCommentedContract.sol
│   │   │   ├── CompilerBugStorageSignedIntegerArray.sol
│   │   │   ├── ConstantFuncsAssembly.sol
│   │   │   ├── ConstantsLiterals.sol
│   │   │   ├── ConstFuncChangeState.sol
│   │   │   ├── ContractLocksEther.sol
│   │   │   ├── ContractWithTodo.sol
│   │   │   ├── control_flow
│   │   │   │   └── SimpleProgram.sol
│   │   │   ├── CostlyOperationsInsideLoops.sol
│   │   │   ├── Counter.sol
│   │   │   ├── CrazyPragma.sol
│   │   │   ├── DangerousStrictEquality1.sol
│   │   │   ├── DangerousStrictEquality2.sol
│   │   │   ├── DangerousUnaryOperator.sol
│   │   │   ├── DeadCode.sol
│   │   │   ├── DelegateCallWithoutAddressCheck.sol
│   │   │   ├── DeletionNestedMappingStructureContract.sol
│   │   │   ├── DeprecatedOZFunctions.sol
│   │   │   ├── DivisionBeforeMultiplication.sol
│   │   │   ├── DynamicArrayLengthAssignment.sol
│   │   │   ├── EmitAfterExternalCall.sol
│   │   │   ├── EmptyBlocks.sol
│   │   │   ├── EnumerableSetIteration.sol
│   │   │   ├── eth2
│   │   │   │   └── DepositContract.sol
│   │   │   ├── ExperimentalEncoder.sol
│   │   │   ├── ExternalCalls.sol
│   │   │   ├── FunctionInitializingState.sol
│   │   │   ├── FunctionPointers.sol
│   │   │   ├── FunctionSignatureCollision.sol
│   │   │   ├── HugeConstants.sol
│   │   │   ├── IgnoreEverything.sol
│   │   │   ├── InconsistentUints.sol
│   │   │   ├── IncorrectCaretOperator.sol
│   │   │   ├── IncorrectERC20.sol
│   │   │   ├── IncorrectERC721.sol
│   │   │   ├── IncorrectModifier.sol
│   │   │   ├── IncorrectShift.sol
│   │   │   ├── inheritance
│   │   │   │   ├── ExtendedInheritance.sol
│   │   │   │   ├── IContractInheritance.sol
│   │   │   │   └── InheritanceBase.sol
│   │   │   ├── InternalFunctions.sol
│   │   │   ├── KeccakContract.sol
│   │   │   ├── LocalVariableShadow.sol
│   │   │   ├── MissingInheritance.sol
│   │   │   ├── MisusedBoolean.sol
│   │   │   ├── MsgValueInLoop.sol
│   │   │   ├── MultipleConstructorSchemes.sol
│   │   │   ├── MultiplePlaceholders.sol
│   │   │   ├── nested
│   │   │   │   ├── 1
│   │   │   │   │   └── Nested.sol
│   │   │   │   └── 2
│   │   │   │       └── Nested.sol
│   │   │   ├── nested_mappings
│   │   │   │   ├── LaterVersion.sol
│   │   │   │   └── NestedMappings.sol
│   │   │   ├── OnceModifierExample.sol
│   │   │   ├── OnlyLibrary.sol
│   │   │   ├── OutOfOrderRetryable.sol
│   │   │   ├── parent_chain
│   │   │   │   └── ParentChainContract.sol
│   │   │   ├── PragmaRange.sol
│   │   │   ├── PreDeclaredVarUsage.sol
│   │   │   ├── PublicFunction.sol
│   │   │   ├── PublicVariableReadInExternalContext.sol
│   │   │   ├── RedundantStatements.sol
│   │   │   ├── ReturnBomb.sol
│   │   │   ├── reused_contract_name
│   │   │   │   ├── ContractA.sol
│   │   │   │   └── ContractB.sol
│   │   │   ├── RevertsAndRequriesInLoops.sol
│   │   │   ├── router
│   │   │   │   ├── ExternalCalls.sol
│   │   │   │   ├── FallbackAndReceiveOverrides.sol
│   │   │   │   ├── InternalCalls.sol
│   │   │   │   ├── ModifierCalls.sol
│   │   │   │   └── VarOverridesFunction.sol
│   │   │   ├── RTLO.sol
│   │   │   ├── SendEtherNoChecks.sol
│   │   │   ├── SendEtherNoChecksLibImport.sol
│   │   │   ├── StateChangeAfterExternalCall.sol
│   │   │   ├── StateShadowing.sol
│   │   │   ├── StateVariableCouldBeDeclaredConstant.sol
│   │   │   ├── StateVariableCouldBeDeclaredImmutable.sol
│   │   │   ├── StateVariables.sol
│   │   │   ├── StateVariablesChangesWithoutEvents.sol
│   │   │   ├── StateVariablesManipulation.sol
│   │   │   ├── StorageConditionals.sol
│   │   │   ├── StorageParameters.sol
│   │   │   ├── T11sTranferer.sol
│   │   │   ├── TautologicalCompare.sol
│   │   │   ├── TautologyOrContradiction.sol
│   │   │   ├── TestERC20.sol
│   │   │   ├── TransientKeyword.sol
│   │   │   ├── Trump.sol
│   │   │   ├── TxOriginUsedForAuth.sol
│   │   │   ├── U2.sol
│   │   │   ├── U3.sol
│   │   │   ├── U4.sol
│   │   │   ├── U5.sol
│   │   │   ├── UncheckedCalls.sol
│   │   │   ├── UncheckedReturn.sol
│   │   │   ├── UncheckedSend.sol
│   │   │   ├── UninitializedLocalVariables.sol
│   │   │   ├── UninitializedStateVariable.sol
│   │   │   ├── uniswap
│   │   │   │   ├── UniswapV2Swapper.sol
│   │   │   │   └── UniswapV3Swapper.sol
│   │   │   ├── UnprotectedInitialize.sol
│   │   │   ├── UnsafeERC721Mint.sol
│   │   │   ├── UnusedError.sol
│   │   │   ├── UnusedImport.sol
│   │   │   ├── UnusedStateVariables.sol
│   │   │   ├── UsingSelfdestruct.sol
│   │   │   ├── VoidConstructor.sol
│   │   │   ├── WeakRandomness.sol
│   │   │   ├── WrongOrderOfLayout.sol
│   │   │   ├── YulReturn.sol
│   │   │   └── ZeroAddressCheck.sol
│   │   └── test
│   │       └── Counter.t.sol
│   ├── foundry-nft-f23
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── test.yml
│   │   ├── .gitignore
│   │   ├── foundry.lock
│   │   ├── foundry.toml
│   │   ├── README.md
│   │   ├── remappings.txt
│   │   └── src
│   │       ├── BasicNft.sol
│   │       ├── F1.sol
│   │       ├── F2.sol
│   │       ├── Initializer.sol
│   │       └── inner-core-modules
│   │           └── ICM.sol
│   ├── foundry-nft-f23-icm
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── test.yml
│   │   ├── .gitignore
│   │   ├── aderyn.toml
│   │   ├── foundry.toml
│   │   ├── README.md
│   │   ├── remappings.txt
│   │   └── src
│   │       ├── BasicNft.sol
│   │       ├── F1.sol
│   │       ├── F2.sol
│   │       ├── Initializer.sol
│   │       └── inner-core-modules
│   │           └── ICM.sol
│   ├── hardhat-js-playground
│   │   ├── .gitignore
│   │   ├── artifacts
│   │   │   ├── build-info
│   │   │   │   └── cee6fe9a9a2f03f7ff10a27ab2746af6.json
│   │   │   └── contracts
│   │   │       ├── Counter.sol
│   │   │       │   ├── Counter.dbg.json
│   │   │       │   └── Counter.json
│   │   │       ├── ExtendedInheritance.sol
│   │   │       │   ├── ExtendedInheritance.dbg.json
│   │   │       │   └── ExtendedInheritance.json
│   │   │       ├── IContractInheritance.sol
│   │   │       │   ├── IContractInheritance.dbg.json
│   │   │       │   └── IContractInheritance.json
│   │   │       ├── InheritanceBase.sol
│   │   │       │   ├── InheritanceBase.dbg.json
│   │   │       │   └── InheritanceBase.json
│   │   │       ├── KeccakContract.sol
│   │   │       │   ├── KeccakContract.dbg.json
│   │   │       │   └── KeccakContract.json
│   │   │       ├── Lock.sol
│   │   │       │   ├── Lock.dbg.json
│   │   │       │   └── Lock.json
│   │   │       └── StateVariables.sol
│   │   │           ├── StateVariables.dbg.json
│   │   │           └── StateVariables.json
│   │   ├── contracts
│   │   │   ├── Counter.sol
│   │   │   ├── ExtendedInheritance.sol
│   │   │   ├── IContractInheritance.sol
│   │   │   ├── InheritanceBase.sol
│   │   │   ├── KeccakContract.sol
│   │   │   ├── Lock.sol
│   │   │   └── StateVariables.sol
│   │   ├── hardhat.config.js
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── scripts
│   │   │   └── deploy.js
│   │   ├── test
│   │   │   └── Lock.js
│   │   └── yarn.lock
│   ├── no-sol-files
│   │   ├── extra
│   │   │   └── HelloAgain.md
│   │   ├── Hello.txt
│   │   └── Hello.yul
│   └── toml
│       ├── nested_project1
│       │   ├── aderyn.toml
│       │   ├── folder1
│       │   │   └── hardhat.config.ts
│       │   ├── folder2
│       │   │   └── hardhat.config.ts
│       │   └── folder3
│       │       └── file.txt
│       └── nested_project2
│           ├── aderyn.toml
│           ├── folder1
│           │   └── foundry.toml
│           └── folder2
│               └── file1.txt
├── tools
│   └── xtask
│       ├── Cargo.toml
│       └── src
│           ├── blesspr.rs
│           ├── cut_release.rs
│           ├── flags.rs
│           ├── main.rs
│           ├── reportgen.rs
│           └── tomlgen.rs
└── typos.toml
```

# Files

--------------------------------------------------------------------------------
/tests/hardhat-js-playground/artifacts/contracts/ExtendedInheritance.sol/ExtendedInheritance.json:
--------------------------------------------------------------------------------

```json
  1 | {
  2 |   "_format": "hh-sol-artifact-1",
  3 |   "contractName": "ExtendedInheritance",
  4 |   "sourceName": "contracts/ExtendedInheritance.sol",
  5 |   "abi": [
  6 |     {
  7 |       "anonymous": false,
  8 |       "inputs": [
  9 |         {
 10 |           "indexed": false,
 11 |           "internalType": "uint256",
 12 |           "name": "something",
 13 |           "type": "uint256"
 14 |         }
 15 |       ],
 16 |       "name": "Do",
 17 |       "type": "event"
 18 |     },
 19 |     {
 20 |       "anonymous": false,
 21 |       "inputs": [
 22 |         {
 23 |           "indexed": false,
 24 |           "internalType": "uint256",
 25 |           "name": "somethingElse",
 26 |           "type": "uint256"
 27 |         }
 28 |       ],
 29 |       "name": "DoSomethingElse",
 30 |       "type": "event"
 31 |     },
 32 |     {
 33 |       "anonymous": false,
 34 |       "inputs": [
 35 |         {
 36 |           "indexed": true,
 37 |           "internalType": "uint256",
 38 |           "name": "somethingElse",
 39 |           "type": "uint256"
 40 |         }
 41 |       ],
 42 |       "name": "DoSomethingElseWithIndex",
 43 |       "type": "event"
 44 |     },
 45 |     {
 46 |       "inputs": [
 47 |         {
 48 |           "internalType": "uint256",
 49 |           "name": "somethingElse",
 50 |           "type": "uint256"
 51 |         }
 52 |       ],
 53 |       "name": "doSomething",
 54 |       "outputs": [],
 55 |       "stateMutability": "nonpayable",
 56 |       "type": "function"
 57 |     },
 58 |     {
 59 |       "inputs": [
 60 |         {
 61 |           "internalType": "address",
 62 |           "name": "target",
 63 |           "type": "address"
 64 |         }
 65 |       ],
 66 |       "name": "doSomethingElse",
 67 |       "outputs": [],
 68 |       "stateMutability": "nonpayable",
 69 |       "type": "function"
 70 |     },
 71 |     {
 72 |       "inputs": [
 73 |         {
 74 |           "internalType": "uint8",
 75 |           "name": "v",
 76 |           "type": "uint8"
 77 |         },
 78 |         {
 79 |           "internalType": "bytes32",
 80 |           "name": "r",
 81 |           "type": "bytes32"
 82 |         },
 83 |         {
 84 |           "internalType": "bytes32",
 85 |           "name": "s",
 86 |           "type": "bytes32"
 87 |         },
 88 |         {
 89 |           "internalType": "bytes32",
 90 |           "name": "theHash",
 91 |           "type": "bytes32"
 92 |         }
 93 |       ],
 94 |       "name": "recoverThatThang",
 95 |       "outputs": [
 96 |         {
 97 |           "internalType": "address",
 98 |           "name": "",
 99 |           "type": "address"
100 |         }
101 |       ],
102 |       "stateMutability": "pure",
103 |       "type": "function"
104 |     }
105 |   ],
106 |   "bytecode": "0x608060405234801561001057600080fd5b50610610806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80637277d9d214610046578063a5666fa214610062578063a6b206bf14610092575b600080fd5b610060600480360381019061005b91906102be565b6100ae565b005b61007c6004803603810190610077919061035a565b6101c6565b60405161008991906103d0565b60405180910390f35b6100ac60048036038101906100a79190610421565b610221565b005b60005b60038110156101c2578173ffffffffffffffffffffffffffffffffffffffff16816040516024016100e2919061045d565b6040516020818303038152906040527fa6b206bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161016c91906104e9565b600060405180830381855af49150503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b50505080806101ba9061052f565b9150506100b1565b5050565b6000600182868686604051600081526020016040526040516101eb9493929190610595565b6020604051602081039080840390855afa15801561020d573d6000803e3d6000fd5b505050602060405103519050949350505050565b7f33782d62d9804c35aa012275d93a348a1ce28d2558032fbf95b540356f7c900a81604051610250919061045d565b60405180910390a150565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061028b82610260565b9050919050565b61029b81610280565b81146102a657600080fd5b50565b6000813590506102b881610292565b92915050565b6000602082840312156102d4576102d361025b565b5b60006102e2848285016102a9565b91505092915050565b600060ff82169050919050565b610301816102eb565b811461030c57600080fd5b50565b60008135905061031e816102f8565b92915050565b6000819050919050565b61033781610324565b811461034257600080fd5b50565b6000813590506103548161032e565b92915050565b600080600080608085870312156103745761037361025b565b5b60006103828782880161030f565b945050602061039387828801610345565b93505060406103a487828801610345565b92505060606103b587828801610345565b91505092959194509250565b6103ca81610280565b82525050565b60006020820190506103e560008301846103c1565b92915050565b6000819050919050565b6103fe816103eb565b811461040957600080fd5b50565b60008135905061041b816103f5565b92915050565b6000602082840312156104375761043661025b565b5b60006104458482850161040c565b91505092915050565b610457816103eb565b82525050565b6000602082019050610472600083018461044e565b92915050565b600081519050919050565b600081905092915050565b60005b838110156104ac578082015181840152602081019050610491565b60008484015250505050565b60006104c382610478565b6104cd8185610483565b93506104dd81856020860161048e565b80840191505092915050565b60006104f582846104b8565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061053a826103eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361056c5761056b610500565b5b600182019050919050565b61058081610324565b82525050565b61058f816102eb565b82525050565b60006080820190506105aa6000830187610577565b6105b76020830186610586565b6105c46040830185610577565b6105d16060830184610577565b9594505050505056fea26469706673582212203fc91ff64ea071db5e7af5e9c193fde5f32a8464f9d926e3198d362290e18a9c64736f6c63430008140033",
107 |   "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80637277d9d214610046578063a5666fa214610062578063a6b206bf14610092575b600080fd5b610060600480360381019061005b91906102be565b6100ae565b005b61007c6004803603810190610077919061035a565b6101c6565b60405161008991906103d0565b60405180910390f35b6100ac60048036038101906100a79190610421565b610221565b005b60005b60038110156101c2578173ffffffffffffffffffffffffffffffffffffffff16816040516024016100e2919061045d565b6040516020818303038152906040527fa6b206bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161016c91906104e9565b600060405180830381855af49150503d80600081146101a7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ac565b606091505b50505080806101ba9061052f565b9150506100b1565b5050565b6000600182868686604051600081526020016040526040516101eb9493929190610595565b6020604051602081039080840390855afa15801561020d573d6000803e3d6000fd5b505050602060405103519050949350505050565b7f33782d62d9804c35aa012275d93a348a1ce28d2558032fbf95b540356f7c900a81604051610250919061045d565b60405180910390a150565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061028b82610260565b9050919050565b61029b81610280565b81146102a657600080fd5b50565b6000813590506102b881610292565b92915050565b6000602082840312156102d4576102d361025b565b5b60006102e2848285016102a9565b91505092915050565b600060ff82169050919050565b610301816102eb565b811461030c57600080fd5b50565b60008135905061031e816102f8565b92915050565b6000819050919050565b61033781610324565b811461034257600080fd5b50565b6000813590506103548161032e565b92915050565b600080600080608085870312156103745761037361025b565b5b60006103828782880161030f565b945050602061039387828801610345565b93505060406103a487828801610345565b92505060606103b587828801610345565b91505092959194509250565b6103ca81610280565b82525050565b60006020820190506103e560008301846103c1565b92915050565b6000819050919050565b6103fe816103eb565b811461040957600080fd5b50565b60008135905061041b816103f5565b92915050565b6000602082840312156104375761043661025b565b5b60006104458482850161040c565b91505092915050565b610457816103eb565b82525050565b6000602082019050610472600083018461044e565b92915050565b600081519050919050565b600081905092915050565b60005b838110156104ac578082015181840152602081019050610491565b60008484015250505050565b60006104c382610478565b6104cd8185610483565b93506104dd81856020860161048e565b80840191505092915050565b60006104f582846104b8565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061053a826103eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361056c5761056b610500565b5b600182019050919050565b61058081610324565b82525050565b61058f816102eb565b82525050565b60006080820190506105aa6000830187610577565b6105b76020830186610586565b6105c46040830185610577565b6105d16060830184610577565b9594505050505056fea26469706673582212203fc91ff64ea071db5e7af5e9c193fde5f32a8464f9d926e3198d362290e18a9c64736f6c63430008140033",
108 |   "linkReferences": {},
109 |   "deployedLinkReferences": {}
110 | }
111 | 
```

--------------------------------------------------------------------------------
/benchmarks/ecrecover/report/both/regression.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | ecrecover
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Total sample time (ms)
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | Iterations (x 10^3)
 10 | </text>
 11 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="87" y2="53"/>
 12 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="173" y1="472" x2="173" y2="53"/>
 13 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="259" y1="472" x2="259" y2="53"/>
 14 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="345" y1="472" x2="345" y2="53"/>
 15 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="431" y1="472" x2="431" y2="53"/>
 16 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="518" y1="472" x2="518" y2="53"/>
 17 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="604" y1="472" x2="604" y2="53"/>
 18 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="690" y1="472" x2="690" y2="53"/>
 19 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="776" y1="472" x2="776" y2="53"/>
 20 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="863" y1="472" x2="863" y2="53"/>
 21 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="932" y2="472"/>
 22 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="433" x2="932" y2="433"/>
 23 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="393" x2="932" y2="393"/>
 24 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="353" x2="932" y2="353"/>
 25 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="314" x2="932" y2="314"/>
 26 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="274" x2="932" y2="274"/>
 27 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="234" x2="932" y2="234"/>
 28 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="195" x2="932" y2="195"/>
 29 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="155" x2="932" y2="155"/>
 30 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="115" x2="932" y2="115"/>
 31 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="76" x2="932" y2="76"/>
 32 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 33 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 34 | 0.0
 35 | </text>
 36 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
 37 | <text x="77" y="433" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 38 | 10.0
 39 | </text>
 40 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,433 86,433 "/>
 41 | <text x="77" y="393" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 42 | 20.0
 43 | </text>
 44 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,393 86,393 "/>
 45 | <text x="77" y="353" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 46 | 30.0
 47 | </text>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,353 86,353 "/>
 49 | <text x="77" y="314" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | 40.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,314 86,314 "/>
 53 | <text x="77" y="274" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | 50.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,274 86,274 "/>
 57 | <text x="77" y="234" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | 60.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,234 86,234 "/>
 61 | <text x="77" y="195" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | 70.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,195 86,195 "/>
 65 | <text x="77" y="155" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 66 | 80.0
 67 | </text>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,155 86,155 "/>
 69 | <text x="77" y="115" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 70 | 90.0
 71 | </text>
 72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,115 86,115 "/>
 73 | <text x="77" y="76" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 74 | 100.0
 75 | </text>
 76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,76 86,76 "/>
 77 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 78 | <text x="87" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 79 | 0
 80 | </text>
 81 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 87,478 "/>
 82 | <text x="173" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 83 | 2
 84 | </text>
 85 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="173,473 173,478 "/>
 86 | <text x="259" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 87 | 4
 88 | </text>
 89 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="259,473 259,478 "/>
 90 | <text x="345" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 91 | 6
 92 | </text>
 93 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="345,473 345,478 "/>
 94 | <text x="431" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | 8
 96 | </text>
 97 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="431,473 431,478 "/>
 98 | <text x="518" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 99 | 10
100 | </text>
101 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="518,473 518,478 "/>
102 | <text x="604" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
103 | 12
104 | </text>
105 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="604,473 604,478 "/>
106 | <text x="690" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
107 | 14
108 | </text>
109 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="690,473 690,478 "/>
110 | <text x="776" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
111 | 16
112 | </text>
113 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="776,473 776,478 "/>
114 | <text x="863" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
115 | 18
116 | </text>
117 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="863,473 863,478 "/>
118 | <polyline fill="none" opacity="1" stroke="#E31A1C" stroke-width="1" points="87,472 932,81 "/>
119 | <polygon opacity="0.25" fill="#E31A1C" points="87,472 932,85 932,77 "/>
120 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,472 932,53 "/>
121 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 932,73 932,53 "/>
122 | <text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
123 | Base Sample
124 | </text>
125 | <text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
126 | New Sample
127 | </text>
128 | <polyline fill="none" opacity="1" stroke="#E31A1C" stroke-width="2" points="102,73 122,73 "/>
129 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
130 | </svg>
131 | 
```

--------------------------------------------------------------------------------
/benchmarks/empty-block/report/both/regression.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | empty-block
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Total sample time (ms)
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | Iterations (x 10^3)
 10 | </text>
 11 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="87" y2="53"/>
 12 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="175" y1="472" x2="175" y2="53"/>
 13 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="264" y1="472" x2="264" y2="53"/>
 14 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="353" y1="472" x2="353" y2="53"/>
 15 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="442" y1="472" x2="442" y2="53"/>
 16 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="531" y1="472" x2="531" y2="53"/>
 17 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="620" y1="472" x2="620" y2="53"/>
 18 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="709" y1="472" x2="709" y2="53"/>
 19 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="798" y1="472" x2="798" y2="53"/>
 20 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="887" y1="472" x2="887" y2="53"/>
 21 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="932" y2="472"/>
 22 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="433" x2="932" y2="433"/>
 23 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="394" x2="932" y2="394"/>
 24 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="354" x2="932" y2="354"/>
 25 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="315" x2="932" y2="315"/>
 26 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="276" x2="932" y2="276"/>
 27 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="236" x2="932" y2="236"/>
 28 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="197" x2="932" y2="197"/>
 29 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="158" x2="932" y2="158"/>
 30 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="118" x2="932" y2="118"/>
 31 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="79" x2="932" y2="79"/>
 32 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 33 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 34 | 0.0
 35 | </text>
 36 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
 37 | <text x="77" y="433" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 38 | 10.0
 39 | </text>
 40 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,433 86,433 "/>
 41 | <text x="77" y="394" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 42 | 20.0
 43 | </text>
 44 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,394 86,394 "/>
 45 | <text x="77" y="354" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 46 | 30.0
 47 | </text>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,354 86,354 "/>
 49 | <text x="77" y="315" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | 40.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,315 86,315 "/>
 53 | <text x="77" y="276" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | 50.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,276 86,276 "/>
 57 | <text x="77" y="236" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | 60.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,236 86,236 "/>
 61 | <text x="77" y="197" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | 70.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,197 86,197 "/>
 65 | <text x="77" y="158" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 66 | 80.0
 67 | </text>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,158 86,158 "/>
 69 | <text x="77" y="118" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 70 | 90.0
 71 | </text>
 72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,118 86,118 "/>
 73 | <text x="77" y="79" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 74 | 100.0
 75 | </text>
 76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,79 86,79 "/>
 77 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 78 | <text x="87" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 79 | 0
 80 | </text>
 81 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 87,478 "/>
 82 | <text x="175" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 83 | 0.2
 84 | </text>
 85 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="175,473 175,478 "/>
 86 | <text x="264" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 87 | 0.4
 88 | </text>
 89 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="264,473 264,478 "/>
 90 | <text x="353" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 91 | 0.6
 92 | </text>
 93 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="353,473 353,478 "/>
 94 | <text x="442" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | 0.8
 96 | </text>
 97 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="442,473 442,478 "/>
 98 | <text x="531" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 99 | 1
100 | </text>
101 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="531,473 531,478 "/>
102 | <text x="620" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
103 | 1.2
104 | </text>
105 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="620,473 620,478 "/>
106 | <text x="709" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
107 | 1.4
108 | </text>
109 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="709,473 709,478 "/>
110 | <text x="798" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
111 | 1.6
112 | </text>
113 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="798,473 798,478 "/>
114 | <text x="887" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
115 | 1.8
116 | </text>
117 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="887,473 887,478 "/>
118 | <polyline fill="none" opacity="1" stroke="#E31A1C" stroke-width="1" points="87,472 932,53 "/>
119 | <polygon opacity="0.25" fill="#E31A1C" points="87,472 932,59 932,53 "/>
120 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,472 932,102 "/>
121 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 932,104 932,100 "/>
122 | <text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
123 | Base Sample
124 | </text>
125 | <text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
126 | New Sample
127 | </text>
128 | <polyline fill="none" opacity="1" stroke="#E31A1C" stroke-width="2" points="102,73 122,73 "/>
129 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
130 | </svg>
131 | 
```

--------------------------------------------------------------------------------
/benchmarks/large-numeric-literal/report/both/regression.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | large-numeric-literal
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Total sample time (ms)
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | Iterations (x 10^3)
 10 | </text>
 11 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="87" y2="53"/>
 12 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="180" y1="472" x2="180" y2="53"/>
 13 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="274" y1="472" x2="274" y2="53"/>
 14 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="368" y1="472" x2="368" y2="53"/>
 15 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="462" y1="472" x2="462" y2="53"/>
 16 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="556" y1="472" x2="556" y2="53"/>
 17 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="650" y1="472" x2="650" y2="53"/>
 18 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="744" y1="472" x2="744" y2="53"/>
 19 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="838" y1="472" x2="838" y2="53"/>
 20 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="932" y1="472" x2="932" y2="53"/>
 21 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="932" y2="472"/>
 22 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="431" x2="932" y2="431"/>
 23 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="389" x2="932" y2="389"/>
 24 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="348" x2="932" y2="348"/>
 25 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="306" x2="932" y2="306"/>
 26 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="265" x2="932" y2="265"/>
 27 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="223" x2="932" y2="223"/>
 28 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="182" x2="932" y2="182"/>
 29 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="140" x2="932" y2="140"/>
 30 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="99" x2="932" y2="99"/>
 31 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="57" x2="932" y2="57"/>
 32 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 33 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 34 | 0.0
 35 | </text>
 36 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
 37 | <text x="77" y="431" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 38 | 10.0
 39 | </text>
 40 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,431 86,431 "/>
 41 | <text x="77" y="389" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 42 | 20.0
 43 | </text>
 44 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,389 86,389 "/>
 45 | <text x="77" y="348" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 46 | 30.0
 47 | </text>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,348 86,348 "/>
 49 | <text x="77" y="306" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | 40.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,306 86,306 "/>
 53 | <text x="77" y="265" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | 50.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,265 86,265 "/>
 57 | <text x="77" y="223" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | 60.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,223 86,223 "/>
 61 | <text x="77" y="182" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | 70.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,182 86,182 "/>
 65 | <text x="77" y="140" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 66 | 80.0
 67 | </text>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,140 86,140 "/>
 69 | <text x="77" y="99" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 70 | 90.0
 71 | </text>
 72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,99 86,99 "/>
 73 | <text x="77" y="57" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 74 | 100.0
 75 | </text>
 76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,57 86,57 "/>
 77 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 78 | <text x="87" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 79 | 0
 80 | </text>
 81 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 87,478 "/>
 82 | <text x="180" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 83 | 0.2
 84 | </text>
 85 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="180,473 180,478 "/>
 86 | <text x="274" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 87 | 0.4
 88 | </text>
 89 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="274,473 274,478 "/>
 90 | <text x="368" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 91 | 0.6
 92 | </text>
 93 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="368,473 368,478 "/>
 94 | <text x="462" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | 0.8
 96 | </text>
 97 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="462,473 462,478 "/>
 98 | <text x="556" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 99 | 1
100 | </text>
101 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="556,473 556,478 "/>
102 | <text x="650" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
103 | 1.2
104 | </text>
105 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="650,473 650,478 "/>
106 | <text x="744" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
107 | 1.4
108 | </text>
109 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="744,473 744,478 "/>
110 | <text x="838" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
111 | 1.6
112 | </text>
113 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="838,473 838,478 "/>
114 | <text x="932" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
115 | 1.8
116 | </text>
117 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="932,473 932,478 "/>
118 | <polyline fill="none" opacity="1" stroke="#E31A1C" stroke-width="1" points="87,472 932,77 "/>
119 | <polygon opacity="0.25" fill="#E31A1C" points="87,472 932,79 932,75 "/>
120 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,472 932,53 "/>
121 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 932,57 932,53 "/>
122 | <text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
123 | Base Sample
124 | </text>
125 | <text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
126 | New Sample
127 | </text>
128 | <polyline fill="none" opacity="1" stroke="#E31A1C" stroke-width="2" points="102,73 122,73 "/>
129 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
130 | </svg>
131 | 
```

--------------------------------------------------------------------------------
/aderyn/src/lsp.rs:
--------------------------------------------------------------------------------

```rust
  1 | use log::{info, warn};
  2 | use notify_debouncer_full::notify::{Event, RecommendedWatcher, Result as NotifyResult};
  3 | use std::{collections::HashSet, path::PathBuf, sync::Arc, time::Duration};
  4 | use tokio::{
  5 |     runtime::Builder,
  6 |     sync::{Mutex, mpsc::Receiver},
  7 | };
  8 | use tower_lsp::{
  9 |     Client, ClientSocket, LanguageServer, LspService, Server, jsonrpc::Result, lsp_types::*,
 10 | };
 11 | 
 12 | use aderyn_driver::driver::{self, Args};
 13 | 
 14 | use notify_debouncer_full::notify::{Config, RecursiveMode, Watcher};
 15 | 
 16 | #[derive(Debug)]
 17 | struct LanguageServerBackend {
 18 |     client: Arc<Mutex<Client>>,
 19 | }
 20 | 
 21 | #[tower_lsp::async_trait]
 22 | impl LanguageServer for LanguageServerBackend {
 23 |     async fn initialize(&self, params: InitializeParams) -> Result<InitializeResult> {
 24 |         info!("TLSP initialize: {:?}", params.capabilities);
 25 | 
 26 |         let code_editor = self.client.lock().await;
 27 |         code_editor
 28 |             .log_message(MessageType::INFO, "Aderyn LSP received an initialization request!")
 29 |             .await;
 30 | 
 31 |         Ok(InitializeResult {
 32 |             capabilities: ServerCapabilities {
 33 |                 text_document_sync: Some(TextDocumentSyncCapability::Options(
 34 |                     TextDocumentSyncOptions {
 35 |                         open_close: Some(false),
 36 |                         change: None,
 37 |                         will_save: Some(false),
 38 |                         will_save_wait_until: Some(false),
 39 |                         save: None,
 40 |                     },
 41 |                 )),
 42 |                 ..Default::default()
 43 |             },
 44 |             ..Default::default()
 45 |         })
 46 |     }
 47 | 
 48 |     async fn initialized(&self, params: InitializedParams) {
 49 |         info!("TLSP initialized: {:?}", params);
 50 | 
 51 |         let code_editor = self.client.lock().await;
 52 |         code_editor
 53 |             .log_message(
 54 |                 MessageType::INFO,
 55 |                 "Aderyn LSP has been notified that the edtior's LSP client is initialized.",
 56 |             )
 57 |             .await;
 58 |     }
 59 | 
 60 |     async fn shutdown(&self) -> Result<()> {
 61 |         info!("TLSP shutdown");
 62 | 
 63 |         let code_editor = self.client.lock().await;
 64 |         code_editor.log_message(MessageType::INFO, "Aderyn LSP has been shutdown").await;
 65 |         Ok(())
 66 |     }
 67 | }
 68 | 
 69 | pub fn spin_up_language_server(args: Args) {
 70 |     // Setup the logging file
 71 |     // NOTE: Uncomment this for debugging purposes
 72 |     //_ = log_to_file(
 73 |     //    "/Users/tilakmadichetti/Documents/OpenSource/my-first-vscode-lsp/lsp_server.log",
 74 |     //    LevelFilter::Info,
 75 |     //);
 76 | 
 77 |     // Create tokio runtime to run futures
 78 | 
 79 |     let async_runtime = Builder::new_multi_thread()
 80 |         .worker_threads(20)
 81 |         .thread_name("aderyn-async-runtime")
 82 |         .thread_stack_size(3 * 1024 * 1024)
 83 |         .enable_all()
 84 |         .build()
 85 |         .expect("unable to start async runtime");
 86 | 
 87 |     // Block on this function
 88 |     async_runtime.block_on(async {
 89 |         // Channel to communicate file system changes (triggered when files are added, removed, or
 90 |         // changed)
 91 |         let (tx_file_change_event, rx_file_change_event) = tokio::sync::mpsc::channel(10);
 92 | 
 93 |         // Create the async watcher
 94 |         let mut file_system_watcher = RecommendedWatcher::new(
 95 |             move |res| {
 96 |                 tx_file_change_event
 97 |                     .blocking_send(res)
 98 |                     .expect("unable to notify file rx_file_change_event receiver");
 99 |             },
100 |             Config::default()
101 |                 .with_poll_interval(Duration::from_millis(20))
102 |                 .with_compare_contents(false),
103 |         )
104 |         .expect("couldn't create file system watcher");
105 | 
106 |         // Watch for file changes
107 |         file_system_watcher
108 |             .watch(
109 |                 PathBuf::from(args.input_config.root.clone()).as_path(),
110 |                 RecursiveMode::Recursive,
111 |             )
112 |             .expect("unable to watch for file changes");
113 | 
114 |         // Most editor's LSP clients communicate through stdout/stdin channels. Theefore use
115 |         // a log file to send debugging statements. Please note EVERY BYTE FLOWING IN
116 |         // STDOUT/STDIN MUST FOLLOW THE LSP PROTOCOL.
117 |         let stdin = tokio::io::stdin();
118 |         let stdout = tokio::io::stdout();
119 |         let (service, socket) =
120 |             create_lsp_service_and_react_to_file_event(rx_file_change_event, args);
121 | 
122 |         // This loop will run until the client issues a shutdown request to our LSP server
123 |         Server::new(stdin, stdout, socket).serve(service).await;
124 |     });
125 | }
126 | 
127 | /// Perform 2 things in parallel
128 | /// 1. React to file changes by regenerating diagnostics
129 | /// 2. Talk to the LSP client and push only the required diagnostics
130 | fn create_lsp_service_and_react_to_file_event(
131 |     rx_file_change_event: Receiver<NotifyResult<Event>>,
132 |     args: Args,
133 | ) -> (LspService<LanguageServerBackend>, ClientSocket) {
134 |     let (service, socket) = LspService::new(move |client| {
135 |         // Guard the receiver and the client so we can send them across threads
136 |         let guarded_client = Arc::new(Mutex::new(client));
137 |         let guarded_file_change_event_receiver = Arc::new(Mutex::new(rx_file_change_event));
138 | 
139 |         // Clone the guarded client (but it doesn't actually clone, it just clones the reference).
140 |         // Do not use `.clone()` but rather `Arc::clone()` to make this clear.
141 |         let guarded_client_clone = Arc::clone(&guarded_client);
142 |         let guarded_file_change_event_receiver_clone =
143 |             Arc::clone(&guarded_file_change_event_receiver);
144 | 
145 |         // Create a guard that keeps track of all the files to which diagnostics were sent in the
146 |         // last run. This is because LSP spec expects to manually push an empty vec![] to clean up
147 |         // stale diagnostics. So we every time, we generate a report, we should check to see if
148 |         // there has been a file left out that previously had errors, if so, then clean it.
149 |         let seen_file_uris: Arc<Mutex<HashSet<Url>>> = Arc::new(Mutex::new(HashSet::new()));
150 | 
151 |         async fn generate_diagnostics_and_publish(
152 |             args: &Args,
153 |             guarded_client: Arc<Mutex<Client>>,
154 |             seen_file_uris: Arc<Mutex<HashSet<Url>>>,
155 |         ) {
156 |             // Generate diagnostics due to this change
157 |             let guarded_report_results = driver::fetch_report_for_lsp(args.clone());
158 | 
159 |             // Extract report from the mutex
160 |             let mut diagnostics_mutex = guarded_report_results.lock().await;
161 | 
162 |             let Some(diagnostics_report) = &mut *diagnostics_mutex else {
163 |                 warn!("no diagnostics report generated");
164 |                 return;
165 |             };
166 | 
167 |             info!("sending diagnostics to client {:?}", &diagnostics_report.diagnostics);
168 |             let client_mutex = guarded_client.lock().await;
169 | 
170 |             for (file_uri, file_diagnostics) in &diagnostics_report.diagnostics {
171 |                 client_mutex
172 |                     .publish_diagnostics(file_uri.clone(), file_diagnostics.to_vec(), None)
173 |                     .await;
174 |             }
175 | 
176 |             // Clear out the diagnostics for file which had reported errors before
177 |             let current_run_file_uris =
178 |                 diagnostics_report.diagnostics.keys().cloned().collect::<HashSet<_>>();
179 | 
180 |             let mut seen_file_uris_mutex = seen_file_uris.lock().await;
181 |             let seen_file_uris = &mut *seen_file_uris_mutex;
182 | 
183 |             for seen_file_uri in seen_file_uris.iter() {
184 |                 if !&current_run_file_uris.contains(seen_file_uri) {
185 |                     // Clear the diagnostics for this seen file uri
186 |                     // It had errors in the past, but not any more
187 |                     client_mutex.publish_diagnostics(seen_file_uri.clone(), vec![], None).await;
188 |                 }
189 |             }
190 | 
191 |             // Now, update the seen_files with files reported in the current run
192 |             for current_run_file_uri in current_run_file_uris {
193 |                 seen_file_uris.insert(current_run_file_uri);
194 |             }
195 |         }
196 | 
197 |         tokio::spawn(async move {
198 |             // For the first time, run it automatically
199 |             let new_guarded_clone = Arc::clone(&guarded_client);
200 |             let seen_files_uris_clone = Arc::clone(&seen_file_uris);
201 |             generate_diagnostics_and_publish(&args, new_guarded_clone, seen_files_uris_clone).await;
202 | 
203 |             // After that, run it only when you receive file change events from the system
204 |             let mut rxer = guarded_file_change_event_receiver_clone.lock().await;
205 | 
206 |             while let Some(rxer_change) = rxer.recv().await {
207 |                 if rxer_change.is_ok() {
208 |                     info!("rxer change detected");
209 | 
210 |                     let new_guarded_clone = Arc::clone(&guarded_client);
211 |                     let seen_files_uris_clone = Arc::clone(&seen_file_uris);
212 |                     generate_diagnostics_and_publish(
213 |                         &args,
214 |                         new_guarded_clone,
215 |                         seen_files_uris_clone,
216 |                     )
217 |                     .await;
218 |                 } else {
219 |                     warn!("rxer change errored!");
220 |                 }
221 |             }
222 |         });
223 | 
224 |         LanguageServerBackend { client: guarded_client_clone }
225 |     });
226 |     (service, socket)
227 | }
228 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/own/utils.rs:
--------------------------------------------------------------------------------

```rust
  1 | use crate::{ast::*, context::browser::is_extcallish};
  2 | 
  3 | impl FunctionDefinition {
  4 |     /// The kind of function this node defines.
  5 |     #[inline]
  6 |     pub fn kind(&self) -> &FunctionKind {
  7 |         if let Some(kind) = &self.kind {
  8 |             kind
  9 |         } else if self.is_constructor {
 10 |             &FunctionKind::Constructor
 11 |         } else {
 12 |             &FunctionKind::Function
 13 |         }
 14 |     }
 15 | 
 16 |     /// The state mutability of the function.
 17 |     ///
 18 |     /// Note: Before Solidity 0.5.x, this is an approximation, as there was no distinction between
 19 |     /// `view` and `pure`.
 20 |     #[inline]
 21 |     pub fn state_mutability(&self) -> &StateMutability {
 22 |         if let Some(state_mutability) = &self.state_mutability {
 23 |             state_mutability
 24 |         } else if self.is_declared_const {
 25 |             &StateMutability::View
 26 |         } else if self.is_payable {
 27 |             &StateMutability::Payable
 28 |         } else {
 29 |             &StateMutability::NonPayable
 30 |         }
 31 |     }
 32 | 
 33 |     /// HACK
 34 |     /// Internal functions don't have function selectors, because it can have parameters like
 35 |     /// storage pointers. In order to identify internal functions that override other internal
 36 |     /// functions we must be able to pick a combination of type strings and func names to do the
 37 |     /// same.
 38 |     ///
 39 |     /// TODO: Find a better way
 40 |     pub fn selectorish(&self) -> String {
 41 |         let func_name = self.name.to_string();
 42 |         let mut t = String::new();
 43 |         for param in self.parameters.parameters.iter() {
 44 |             if let Some(ts) = param.type_descriptions.type_string.as_ref() {
 45 |                 t.push_str(ts);
 46 |             }
 47 |             t.push('!');
 48 |             if let Some(ti) = param.type_descriptions.type_identifier.as_ref() {
 49 |                 t.push_str(ti);
 50 |             }
 51 |             t.push('@');
 52 |         }
 53 |         func_name + ":" + &t
 54 |     }
 55 | }
 56 | 
 57 | impl ModifierDefinition {
 58 |     /// HACK
 59 |     /// Internal functions don't have function selectors, because it can have parameters like
 60 |     /// storage pointers. In order to identify internal functions that override other internal
 61 |     /// functions we must be able to pick a combination of type strings and func names to do the
 62 |     /// same.
 63 |     ///
 64 |     /// TODO: Find a better way
 65 |     pub fn selectorish(&self) -> String {
 66 |         let func_name = self.name.to_string();
 67 |         let mut t = String::new();
 68 |         for param in self.parameters.parameters.iter() {
 69 |             if let Some(ts) = param.type_descriptions.type_string.as_ref() {
 70 |                 t.push_str(ts);
 71 |             }
 72 |             t.push('!');
 73 |             if let Some(ti) = param.type_descriptions.type_identifier.as_ref() {
 74 |                 t.push_str(ti);
 75 |             }
 76 |             t.push('@');
 77 |         }
 78 |         func_name + ":" + &t
 79 |     }
 80 | }
 81 | 
 82 | impl FunctionCall {
 83 |     /// DO NOT USE
 84 |     /// It doesn't work as expected. This was more so crafted for one specific detector and code
 85 |     /// needs to be migrated.
 86 |     pub fn is_extcallish(&self) -> bool {
 87 |         is_extcallish(self.into())
 88 |     }
 89 | 
 90 |     /// Internal call made to -
 91 |     /// * Internal Library function
 92 |     /// * Public/Private/Internal contract function
 93 |     ///
 94 |     ///  Also see [`FunctionCall::suspected_target_function`]
 95 |     #[inline]
 96 |     pub fn is_internal_call(&self) -> Option<bool> {
 97 |         if self.kind != FunctionCallKind::FunctionCall {
 98 |             return Some(false);
 99 |         }
100 |         // The most common forms of expressions when making a function call is
101 |         // 1) xyz()
102 |         // 2) A.xyz() where A is super or any parent class or library name or a something on which
103 |         //    library is being used for. (using lib for uint8) .... 6.xyz()
104 |         match self.expression.as_ref() {
105 |             Expression::Identifier(Identifier {
106 |                 type_descriptions: TypeDescriptions { type_identifier: Some(ty_ident), .. },
107 |                 ..
108 |             })
109 |             | Expression::MemberAccess(MemberAccess {
110 |                 type_descriptions: TypeDescriptions { type_identifier: Some(ty_ident), .. },
111 |                 ..
112 |             }) => Some(ty_ident.starts_with("t_function_internal")),
113 |             _ => None, // TODO: Exhaust these enums
114 |         }
115 |     }
116 | }
117 | 
118 | impl FunctionCallOptions {
119 |     pub fn is_extcallish(&self) -> bool {
120 |         is_extcallish(self.into())
121 |     }
122 | }
123 | 
124 | impl VariableDeclaration {
125 |     /// Returns the mutability of the variable that was declared.
126 |     ///
127 |     /// This is a helper to check variable mutability across Solidity versions.
128 |     #[inline]
129 |     pub fn mutability(&self) -> Option<&Mutability> {
130 |         if let Some(mutability) = &self.mutability {
131 |             Some(mutability)
132 |         } else if self.constant {
133 |             Some(&Mutability::Constant)
134 |         } else if self.state_variable {
135 |             Some(&Mutability::Mutable)
136 |         } else {
137 |             None
138 |         }
139 |     }
140 | }
141 | 
142 | impl ContractDefinition {
143 |     #[inline]
144 |     pub fn function_definitions(&self) -> Vec<&FunctionDefinition> {
145 |         self.nodes
146 |             .iter()
147 |             .filter_map(|node| {
148 |                 if let ContractDefinitionNode::FunctionDefinition(function_definition) = node {
149 |                     Some(function_definition)
150 |                 } else {
151 |                     None
152 |                 }
153 |             })
154 |             .collect()
155 |     }
156 | 
157 |     #[inline]
158 |     pub fn modifier_definitions(&self) -> Vec<&ModifierDefinition> {
159 |         self.nodes
160 |             .iter()
161 |             .filter_map(|node| {
162 |                 if let ContractDefinitionNode::ModifierDefinition(modifier_definition) = node {
163 |                     Some(modifier_definition)
164 |                 } else {
165 |                     None
166 |                 }
167 |             })
168 |             .collect()
169 |     }
170 | 
171 |     pub fn top_level_variables(&self) -> Vec<&VariableDeclaration> {
172 |         self.nodes
173 |             .iter()
174 |             .filter_map(|node| {
175 |                 if let ContractDefinitionNode::VariableDeclaration(modifier_definition) = node {
176 |                     Some(modifier_definition)
177 |                 } else {
178 |                     None
179 |                 }
180 |             })
181 |             .collect()
182 |     }
183 | 
184 |     #[inline(always)]
185 |     pub fn is_deployable_contract(&self) -> bool {
186 |         self.kind == ContractKind::Contract && !self.is_abstract
187 |     }
188 | }
189 | 
190 | impl IdentifierOrIdentifierPath {
191 |     #[inline]
192 |     pub fn name(&self) -> String {
193 |         match self {
194 |             IdentifierOrIdentifierPath::Identifier(identifier) => identifier.name.clone(),
195 |             IdentifierOrIdentifierPath::IdentifierPath(identifier_path) => {
196 |                 identifier_path.name.clone()
197 |             }
198 |         }
199 |     }
200 | 
201 |     #[inline]
202 |     pub fn referenced_declaration(&self) -> Option<NodeID> {
203 |         match self {
204 |             IdentifierOrIdentifierPath::Identifier(identifier) => identifier.referenced_declaration,
205 |             IdentifierOrIdentifierPath::IdentifierPath(identifier_path) => {
206 |                 Some(identifier_path.referenced_declaration)
207 |             }
208 |         }
209 |     }
210 | }
211 | 
212 | impl UserDefinedTypeNameOrIdentifierPath {
213 |     #[inline]
214 |     pub fn name(&self) -> Option<String> {
215 |         match self {
216 |             UserDefinedTypeNameOrIdentifierPath::UserDefinedTypeName(node) => node.name.clone(),
217 |             UserDefinedTypeNameOrIdentifierPath::IdentifierPath(node) => Some(node.name.clone()),
218 |         }
219 |     }
220 | }
221 | 
222 | impl Expression {
223 |     #[inline]
224 |     pub fn type_descriptions(&self) -> Option<&TypeDescriptions> {
225 |         match self {
226 |             Expression::Literal(Literal { type_descriptions, .. }) => Some(type_descriptions),
227 |             Expression::Identifier(Identifier { type_descriptions, .. }) => Some(type_descriptions),
228 |             Expression::UnaryOperation(UnaryOperation { type_descriptions, .. }) => {
229 |                 Some(type_descriptions)
230 |             }
231 |             Expression::BinaryOperation(BinaryOperation { type_descriptions, .. }) => {
232 |                 Some(type_descriptions)
233 |             }
234 |             Expression::Conditional(Conditional { type_descriptions, .. }) => {
235 |                 Some(type_descriptions)
236 |             }
237 |             Expression::Assignment(Assignment { type_descriptions, .. }) => Some(type_descriptions),
238 |             Expression::FunctionCall(FunctionCall { type_descriptions, .. }) => {
239 |                 Some(type_descriptions)
240 |             }
241 |             Expression::FunctionCallOptions(FunctionCallOptions { type_descriptions, .. }) => {
242 |                 Some(type_descriptions)
243 |             }
244 |             Expression::IndexAccess(IndexAccess { type_descriptions, .. }) => {
245 |                 Some(type_descriptions)
246 |             }
247 |             Expression::IndexRangeAccess(IndexRangeAccess { type_descriptions, .. }) => {
248 |                 Some(type_descriptions)
249 |             }
250 |             Expression::MemberAccess(MemberAccess { type_descriptions, .. }) => {
251 |                 Some(type_descriptions)
252 |             }
253 |             Expression::ElementaryTypeNameExpression(ElementaryTypeNameExpression {
254 |                 type_descriptions,
255 |                 ..
256 |             }) => Some(type_descriptions),
257 |             Expression::TupleExpression(TupleExpression { type_descriptions, .. }) => {
258 |                 Some(type_descriptions)
259 |             }
260 |             Expression::NewExpression(NewExpression { type_descriptions, .. }) => {
261 |                 Some(type_descriptions)
262 |             }
263 |         }
264 |     }
265 | }
266 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/visitor/workspace_visitor.rs:
--------------------------------------------------------------------------------

```rust
  1 | use super::{
  2 |     ast_visitor::ASTConstVisitor,
  3 |     macros::generate_visit_methods_for_workspace_context_with_insert_node,
  4 | };
  5 | use crate::{
  6 |     ast::*,
  7 |     context::workspace::{NodeContext, WorkspaceContext},
  8 | };
  9 | use eyre::Result;
 10 | 
 11 | impl ASTConstVisitor for WorkspaceContext {
 12 |     fn visit_contract_definition(&mut self, node: &ContractDefinition) -> Result<bool> {
 13 |         self.nodes.insert(node.id, ASTNode::ContractDefinition(node.clone()));
 14 |         self.contract_definitions_context.insert(
 15 |             node.clone(),
 16 |             NodeContext {
 17 |                 source_unit_id: self.last_source_unit_id,
 18 |                 contract_definition_id: self.last_contract_definition_id,
 19 |                 function_definition_id: self.last_function_definition_id,
 20 |                 modifier_definition_id: self.last_modifier_definition_id,
 21 |             },
 22 |         );
 23 |         self.last_contract_definition_id = Some(node.id);
 24 |         Ok(true)
 25 |     }
 26 | 
 27 |     fn end_visit_contract_definition(&mut self, _: &ContractDefinition) -> Result<()> {
 28 |         self.last_contract_definition_id = None;
 29 |         Ok(())
 30 |     }
 31 | 
 32 |     fn visit_function_definition(&mut self, node: &FunctionDefinition) -> Result<bool> {
 33 |         self.nodes.insert(node.id, ASTNode::FunctionDefinition(node.clone()));
 34 |         self.function_definitions_context.insert(
 35 |             node.clone(),
 36 |             NodeContext {
 37 |                 source_unit_id: self.last_source_unit_id,
 38 |                 contract_definition_id: self.last_contract_definition_id,
 39 |                 function_definition_id: self.last_function_definition_id,
 40 |                 modifier_definition_id: self.last_modifier_definition_id,
 41 |             },
 42 |         );
 43 |         self.last_function_definition_id = Some(node.id);
 44 |         Ok(true)
 45 |     }
 46 | 
 47 |     fn end_visit_function_definition(&mut self, _: &FunctionDefinition) -> Result<()> {
 48 |         self.last_function_definition_id = None;
 49 |         Ok(())
 50 |     }
 51 | 
 52 |     fn visit_modifier_definition(&mut self, node: &ModifierDefinition) -> Result<bool> {
 53 |         self.nodes.insert(node.id, ASTNode::ModifierDefinition(node.clone()));
 54 |         self.modifier_definitions_context.insert(
 55 |             node.clone(),
 56 |             NodeContext {
 57 |                 source_unit_id: self.last_source_unit_id,
 58 |                 contract_definition_id: self.last_contract_definition_id,
 59 |                 function_definition_id: self.last_function_definition_id,
 60 |                 modifier_definition_id: self.last_modifier_definition_id,
 61 |             },
 62 |         );
 63 |         self.last_modifier_definition_id = Some(node.id);
 64 |         Ok(true)
 65 |     }
 66 | 
 67 |     fn end_visit_modifier_definition(&mut self, _: &ModifierDefinition) -> Result<()> {
 68 |         self.last_modifier_definition_id = None;
 69 |         Ok(())
 70 |     }
 71 | 
 72 |     fn visit_source_unit(&mut self, node: &SourceUnit) -> Result<bool> {
 73 |         self.nodes.insert(node.id, ASTNode::SourceUnit(node.clone()));
 74 |         self.source_units_context.push(node.clone());
 75 |         self.last_source_unit_id = node.id;
 76 |         Ok(true)
 77 |     }
 78 | 
 79 |     fn visit_yul_function_call(&mut self, node: &YulFunctionCall) -> Result<bool> {
 80 |         self.yul_function_calls_context.insert(
 81 |             node.clone(),
 82 |             NodeContext {
 83 |                 source_unit_id: self.last_source_unit_id,
 84 |                 contract_definition_id: self.last_contract_definition_id,
 85 |                 function_definition_id: self.last_function_definition_id,
 86 |                 modifier_definition_id: self.last_modifier_definition_id,
 87 |             },
 88 |         );
 89 |         Ok(true)
 90 |     }
 91 | 
 92 |     fn visit_yul_identifier(&mut self, node: &YulIdentifier) -> Result<bool> {
 93 |         // No node ID in Yul
 94 |         self.yul_identifiers_context.insert(
 95 |             node.clone(),
 96 |             NodeContext {
 97 |                 source_unit_id: self.last_source_unit_id,
 98 |                 contract_definition_id: self.last_contract_definition_id,
 99 |                 function_definition_id: self.last_function_definition_id,
100 |                 modifier_definition_id: self.last_modifier_definition_id,
101 |             },
102 |         );
103 |         Ok(true)
104 |     }
105 | 
106 |     fn visit_yul_assignment(&mut self, node: &YulAssignment) -> Result<bool> {
107 |         self.yul_assignments_context.insert(
108 |             node.clone(),
109 |             NodeContext {
110 |                 source_unit_id: self.last_source_unit_id,
111 |                 contract_definition_id: self.last_contract_definition_id,
112 |                 function_definition_id: self.last_function_definition_id,
113 |                 modifier_definition_id: self.last_modifier_definition_id,
114 |             },
115 |         );
116 |         Ok(true)
117 |     }
118 | 
119 |     // Read the following like follows -
120 |     generate_visit_methods_for_workspace_context_with_insert_node! {
121 |         // Explanation for the 1st one : Create a method called `visit_assignment` that takes in `Assignment` as parameter and puts it inside `assignments_context`
122 |         visit_assignment | Assignment => assignments_context |,
123 |         visit_binary_operation | BinaryOperation => binary_operations_context |,
124 |         visit_block | Block => blocks_context |,
125 |         visit_conditional | Conditional => conditionals_context |,
126 |         visit_elementary_type_name_expression | ElementaryTypeNameExpression => elementary_type_name_expressions_context |,
127 |         visit_enum_definition | EnumDefinition => enum_definitions_context |,
128 |         visit_enum_value | EnumValue => enum_values_context |,
129 |         visit_event_definition | EventDefinition => event_definitions_context |,
130 |         visit_error_definition | ErrorDefinition => error_definitions_context |,
131 |         visit_function_call | FunctionCall => function_calls_context |,
132 |         visit_function_call_options | FunctionCallOptions => function_call_options_context |,
133 |         visit_for_statement | ForStatement => for_statements_context |,
134 |         visit_identifier | Identifier => identifiers_context |,
135 |         visit_identifier_path | IdentifierPath => identifier_paths_context |,
136 |         visit_if_statement | IfStatement => if_statements_context |,
137 |         visit_import_directive | ImportDirective => import_directives_context |,
138 |         visit_index_access | IndexAccess => index_accesses_context |,
139 |         visit_index_range_access | IndexRangeAccess => index_range_accesses_context |,
140 |         visit_inheritance_specifier | InheritanceSpecifier => inheritance_specifiers_context |,
141 |         visit_inline_assembly | InlineAssembly => inline_assemblies_context |,
142 |         visit_literal | Literal => literals_context |,
143 |         visit_member_access | MemberAccess => member_accesses_context |,
144 |         visit_new_expression | NewExpression => new_expressions_context |,
145 |         visit_modifier_invocation | ModifierInvocation => modifier_invocations_context |,
146 |         visit_override_specifier | OverrideSpecifier => override_specifiers_context |,
147 |         visit_parameter_list | ParameterList => parameter_lists_context |,
148 |         visit_pragma_directive | PragmaDirective => pragma_directives_context |,
149 |         visit_return | Return => returns_context |,
150 |         visit_struct_definition | StructDefinition => struct_definitions_context |,
151 |         visit_structured_documentation | StructuredDocumentation => structured_documentations_context |,
152 |         visit_tuple_expression | TupleExpression => tuple_expressions_context |,
153 |         visit_unary_operation | UnaryOperation => unary_operations_context |,
154 |         visit_unchecked_block | UncheckedBlock => unchecked_blocks_context |,
155 |         visit_user_defined_value_type_definition | UserDefinedValueTypeDefinition => user_defined_value_type_definitions_context |,
156 |         visit_using_for_directive | UsingForDirective => using_for_directives_context |,
157 |         visit_variable_declaration | VariableDeclaration => variable_declarations_context |,
158 |         visit_variable_declaration_statement | VariableDeclarationStatement => variable_declaration_statements_context |,
159 |         visit_while_statement | WhileStatement => while_statements_context |,
160 |         visit_do_while_statement | DoWhileStatement => do_while_statements_context |,
161 |         visit_break_statement | Break => break_statements_context |,
162 |         visit_continue_statement | Continue => continue_statements_context |,
163 |         visit_placeholder_statement | PlaceholderStatement => placeholder_statements_context |,
164 |         visit_array_type_name | ArrayTypeName => array_type_names_context |,
165 |         visit_mapping | Mapping => mappings_context |,
166 |         visit_try_statement | TryStatement => try_statements_context |,
167 |         visit_try_catch_clause | TryCatchClause => try_catch_clauses_context |,
168 |         visit_user_defined_type_name | UserDefinedTypeName => user_defined_type_names_context |,
169 |         visit_expression_statement | ExpressionStatement => expression_statements_context |,
170 |         visit_revert_statement | RevertStatement => revert_statements_context |,
171 |         visit_emit_statement | EmitStatement => emit_statements_context |,
172 |         visit_elementary_type_name | ElementaryTypeName => elementary_type_names_context |,
173 |         visit_function_type_name | FunctionTypeName => function_type_names_context |,
174 |     }
175 | 
176 |     fn visit_immediate_children(
177 |         &mut self,
178 |         node_id: NodeID,
179 |         node_children_ids: Vec<NodeID>,
180 |     ) -> Result<()> {
181 |         for id in node_children_ids {
182 |             self.parent_link.insert(id, node_id);
183 |         }
184 |         Ok(())
185 |     }
186 | }
187 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/detect/low/state_no_address_check.rs:
--------------------------------------------------------------------------------

```rust
  1 | use std::{
  2 |     collections::{BTreeMap, HashMap, HashSet},
  3 |     error::Error,
  4 | };
  5 | 
  6 | use crate::{
  7 |     ast::{Assignment, BinaryOperation, Expression, Mutability, NodeID, VariableDeclaration},
  8 |     capture,
  9 |     context::{
 10 |         browser::{ExtractAssignments, ExtractBinaryOperations, ExtractIdentifiers},
 11 |         workspace::WorkspaceContext,
 12 |     },
 13 |     detect::detector::{IssueDetector, IssueDetectorNamePool, IssueSeverity},
 14 | };
 15 | use eyre::Result;
 16 | 
 17 | #[derive(Default)]
 18 | pub struct StateNoAddressCheckDetector {
 19 |     // All the state variables, set at the beginning of the detect Function
 20 |     mutable_address_state_variables: HashMap<i64, VariableDeclaration>,
 21 | 
 22 |     // Keys are: [0] source file name, [1] line number, [2] character location of node.
 23 |     // Do not add items manually, use `capture!` to add nodes to this BTreeMap.
 24 |     found_instances: BTreeMap<(String, usize, String), NodeID>,
 25 | }
 26 | 
 27 | impl IssueDetector for StateNoAddressCheckDetector {
 28 |     fn detect(&mut self, context: &WorkspaceContext) -> Result<bool, Box<dyn Error>> {
 29 |         // Get all address state variables
 30 |         self.mutable_address_state_variables = context
 31 |             .variable_declarations()
 32 |             .iter()
 33 |             .filter_map(|&var_decl| {
 34 |                 if !var_decl.constant
 35 |                     && matches!(var_decl.mutability(), Some(Mutability::Mutable))
 36 |                     && var_decl.state_variable
 37 |                     && (var_decl.type_descriptions.type_string.as_deref().unwrap_or("")
 38 |                         == "address"
 39 |                         || var_decl
 40 |                             .type_descriptions
 41 |                             .type_string
 42 |                             .as_deref()
 43 |                             .unwrap_or("")
 44 |                             .contains("contract "))
 45 |                 {
 46 |                     Some((var_decl.id, (*var_decl).clone())) // Deref and clone the
 47 |                 // VariableDeclaration.
 48 |                 } else {
 49 |                     None
 50 |                 }
 51 |             })
 52 |             .collect();
 53 | 
 54 |         // Get all Function definitions
 55 |         for function_definition in context.function_definitions() {
 56 |             // Get all the binary checks inside the Function
 57 |             let binary_operations: Vec<BinaryOperation> =
 58 |                 ExtractBinaryOperations::from(function_definition)
 59 |                     .extracted
 60 |                     .into_iter()
 61 |                     .filter(|x| x.operator == "==" || x.operator == "!=")
 62 |                     .collect();
 63 | 
 64 |             // Filter the binary checks and extract all node ids into a vector
 65 |             let mut identifier_reference_declaration_ids_in_binary_checks = HashSet::new();
 66 | 
 67 |             for x in binary_operations {
 68 |                 let l = x.left_expression.as_ref();
 69 |                 if let Expression::Identifier(left_identifier) = l {
 70 |                     if let Some(reference_id) = left_identifier.referenced_declaration {
 71 |                         identifier_reference_declaration_ids_in_binary_checks.insert(reference_id);
 72 |                     }
 73 |                 } else {
 74 |                     ExtractIdentifiers::from(l)
 75 |                         .extracted
 76 |                         .into_iter()
 77 |                         .filter_map(|f| f.referenced_declaration)
 78 |                         .for_each(|f| {
 79 |                             identifier_reference_declaration_ids_in_binary_checks.insert(f);
 80 |                         });
 81 |                 }
 82 | 
 83 |                 let r = x.right_expression.as_ref();
 84 |                 if let Expression::Identifier(right_identifier) = r {
 85 |                     if let Some(reference_id) = right_identifier.referenced_declaration {
 86 |                         identifier_reference_declaration_ids_in_binary_checks.insert(reference_id);
 87 |                     }
 88 |                 } else {
 89 |                     ExtractIdentifiers::from(r)
 90 |                         .extracted
 91 |                         .into_iter()
 92 |                         .filter_map(|f| f.referenced_declaration)
 93 |                         .for_each(|f| {
 94 |                             identifier_reference_declaration_ids_in_binary_checks.insert(f);
 95 |                         });
 96 |                 }
 97 |             }
 98 | 
 99 |             // Get all the assignments where the left hand side is a mutable address state variable
100 |             let assignments: Vec<Assignment> = ExtractAssignments::from(function_definition)
101 |                 .extracted
102 |                 .into_iter()
103 |                 .filter(|x| {
104 |                     let left_hand_side = x.left_hand_side.as_ref();
105 |                     if let Expression::Identifier(left_identifier) = left_hand_side {
106 |                         left_identifier.referenced_declaration.is_some_and(|reference_id| {
107 |                             self.mutable_address_state_variables.contains_key(&reference_id)
108 |                         })
109 |                     } else {
110 |                         let left_identifiers = ExtractIdentifiers::from(left_hand_side).extracted;
111 |                         left_identifiers.into_iter().any(|identifier| {
112 |                             identifier.referenced_declaration.is_some_and(|reference_id| {
113 |                                 self.mutable_address_state_variables.contains_key(&reference_id)
114 |                             })
115 |                         })
116 |                     }
117 |                 })
118 |                 .collect();
119 | 
120 |             // For each assignment, if the right hand side is in the
121 |             // identifier_reference_declaration_ids_in_binary_checks and is also in the
122 |             // Function.parameters, then add the assignment to the found_instances
123 |             for assignment in assignments {
124 |                 if let Expression::Identifier(right_identifier) = &*assignment.right_hand_side {
125 |                     if let Some(reference_id) = right_identifier.referenced_declaration
126 |                         && !identifier_reference_declaration_ids_in_binary_checks
127 |                             .contains(&reference_id)
128 |                         && function_definition
129 |                             .parameters
130 |                             .parameters
131 |                             .iter()
132 |                             .any(|x| x.id == reference_id)
133 |                     {
134 |                         capture!(self, context, assignment);
135 |                     }
136 |                 } else {
137 |                     let right_identifiers = ExtractIdentifiers::from(&*assignment.right_hand_side);
138 |                     for right_identifier in right_identifiers.extracted {
139 |                         if let Some(reference_id) = right_identifier.referenced_declaration
140 |                             && !identifier_reference_declaration_ids_in_binary_checks
141 |                                 .contains(&reference_id)
142 |                             && function_definition
143 |                                 .parameters
144 |                                 .parameters
145 |                                 .iter()
146 |                                 .any(|x| x.id == reference_id)
147 |                         {
148 |                             capture!(self, context, assignment);
149 |                         }
150 |                     }
151 |                 }
152 |             }
153 |         }
154 | 
155 |         Ok(!self.found_instances.is_empty())
156 |     }
157 | 
158 |     fn title(&self) -> String {
159 |         String::from("Address State Variable Set Without Checks")
160 |     }
161 | 
162 |     fn description(&self) -> String {
163 |         String::from("Check for `address(0)` when assigning values to address state variables.")
164 |     }
165 | 
166 |     fn severity(&self) -> IssueSeverity {
167 |         IssueSeverity::Low
168 |     }
169 | 
170 |     fn instances(&self) -> BTreeMap<(String, usize, String), NodeID> {
171 |         self.found_instances.clone()
172 |     }
173 | 
174 |     fn name(&self) -> String {
175 |         format!("{}", IssueDetectorNamePool::StateNoAddressCheck)
176 |     }
177 | }
178 | 
179 | #[cfg(test)]
180 | mod zero_address_check_tests {
181 |     use crate::{
182 |         ast::NodeType,
183 |         context::{browser::GetClosestAncestorOfTypeX, workspace::ASTNode},
184 |         detect::{detector::IssueDetector, low::StateNoAddressCheckDetector},
185 |     };
186 | 
187 |     #[test]
188 | 
189 |     fn test_zero_address_check_using_mapping_with_address_in_it() {
190 |         let context = crate::detect::test_utils::load_solidity_source_unit(
191 |             "../tests/contract-playground/src/TestERC20.sol",
192 |         );
193 |         let mut detector = StateNoAddressCheckDetector::default();
194 |         let found = detector.detect(&context).unwrap();
195 |         // assert that nothing was found
196 |         assert!(!found);
197 |     }
198 | 
199 |     #[test]
200 | 
201 |     fn test_zero_address_check_detector_by_loading_contract_directly() {
202 |         let context = crate::detect::test_utils::load_solidity_source_unit(
203 |             "../tests/contract-playground/src/ZeroAddressCheck.sol",
204 |         );
205 | 
206 |         let mut detector = StateNoAddressCheckDetector::default();
207 |         let found = detector.detect(&context).unwrap();
208 |         assert!(found);
209 |         assert_eq!(detector.instances().len(), 3);
210 |         for node_id in detector.instances().values() {
211 |             if let ASTNode::Assignment(assignment) = context.nodes.get(node_id).unwrap() {
212 |                 if let ASTNode::FunctionDefinition(function) = assignment
213 |                     .closest_ancestor_of_type(&context, NodeType::FunctionDefinition)
214 |                     .unwrap()
215 |                 {
216 |                     assert!(function.name.contains("bad"));
217 |                 } else {
218 |                     panic!()
219 |                 }
220 |             } else {
221 |                 panic!()
222 |             }
223 |         }
224 |     }
225 | }
226 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/context/graph/callgraph/visit.rs:
--------------------------------------------------------------------------------

```rust
  1 | #![allow(clippy::large_enum_variant)]
  2 | #![allow(clippy::result_large_err)]
  3 | use std::collections::HashSet;
  4 | 
  5 | use crate::{
  6 |     ast::{NodeID, NodeType},
  7 |     context::{
  8 |         graph::RawCallGraph,
  9 |         workspace::{ASTNode, WorkspaceContext},
 10 |     },
 11 | };
 12 | 
 13 | use super::*;
 14 | 
 15 | impl CallGraphConsumer {
 16 |     /// Responsible for informing the trackers.
 17 |     /// First, we visit the entry points. Then, we derive the subgraph from the
 18 |     /// [`WorkspaceCallGraph`] which consists of all the nodes that can be reached by traversing
 19 |     /// the edges starting from the surface points.
 20 |     pub(super) fn _accept<T>(
 21 |         &self,
 22 |         context: &WorkspaceContext,
 23 |         visitor: &mut T,
 24 |     ) -> super::Result<()>
 25 |     where
 26 |         T: CallGraphVisitor,
 27 |     {
 28 |         let callgraphs = context.callgraphs.as_ref().expect("callgraphs not attached to context");
 29 | 
 30 |         let inward_callgraph = {
 31 |             if self.is_legacy() {
 32 |                 context
 33 |                     .inward_callgraph
 34 |                     .as_ref()
 35 |                     .ok_or(super::Error::InwardCallgraphNotAvailable)?
 36 |                     .raw_callgraph
 37 |                     .clone()
 38 |             } else {
 39 |                 callgraphs
 40 |                     .inward_callgraphs
 41 |                     .get(&self.base_contract.expect("base contract not set"))
 42 |                     .ok_or(super::Error::InwardCallgraphNotAvailable)?
 43 |                     .clone()
 44 |             }
 45 |         };
 46 |         let outward_callgraph = {
 47 |             if self.is_legacy() {
 48 |                 context
 49 |                     .outward_callgraph
 50 |                     .as_ref()
 51 |                     .ok_or(super::Error::OutwardCallgraphNotAvailable)?
 52 |                     .raw_callgraph
 53 |                     .clone()
 54 |             } else {
 55 |                 callgraphs
 56 |                     .outward_callgraphs
 57 |                     .get(&self.base_contract.expect("base contract not set"))
 58 |                     .ok_or(super::Error::OutwardCallgraphNotAvailable)?
 59 |                     .clone()
 60 |             }
 61 |         };
 62 | 
 63 |         // Visit entry point nodes (so that trackers can track the state across all code regions in
 64 |         // 1 place)
 65 |         for entry_point_id in &self.entry_points {
 66 |             self.make_entry_point_visit_call(context, *entry_point_id, visitor)?;
 67 |         }
 68 | 
 69 |         // Keep track of visited node IDs during DFS from surface nodes
 70 |         let mut visited_inward = HashSet::new();
 71 |         let mut visited_outward = HashSet::new();
 72 |         let mut visited_outward_side_effects = HashSet::new();
 73 | 
 74 |         // Now decide, which points to visit outward or inward
 75 |         if self.direction == CallGraphDirection::BothWays
 76 |             || self.direction == CallGraphDirection::Inward
 77 |         {
 78 |             // Visit the subgraph starting from surface points
 79 |             for surface_point_id in &self.inward_surface_points {
 80 |                 self.dfs_and_visit_subgraph(
 81 |                     *surface_point_id,
 82 |                     &mut visited_inward,
 83 |                     context,
 84 |                     &inward_callgraph,
 85 |                     visitor,
 86 |                     CurrentDFSVector::Inward,
 87 |                     None,
 88 |                 )?;
 89 |             }
 90 |         }
 91 | 
 92 |         if self.direction == CallGraphDirection::BothWays
 93 |             || self.direction == CallGraphDirection::Outward
 94 |         {
 95 |             // Visit the subgraph starting from surface points
 96 |             for surface_point_id in &self.outward_surface_points {
 97 |                 self.dfs_and_visit_subgraph(
 98 |                     *surface_point_id,
 99 |                     &mut visited_outward,
100 |                     context,
101 |                     &outward_callgraph,
102 |                     visitor,
103 |                     CurrentDFSVector::Outward,
104 |                     None,
105 |                 )?;
106 |             }
107 |         }
108 | 
109 |         // Collect already visited nodes so that we don't repeat visit calls on them
110 |         // while traversing through side effect nodes.
111 |         let mut blacklisted = HashSet::new();
112 |         blacklisted.extend(visited_inward.iter());
113 |         blacklisted.extend(visited_outward.iter());
114 |         blacklisted.extend(self.entry_points.iter());
115 | 
116 |         if self.direction == CallGraphDirection::BothWays {
117 |             // Visit the subgraph from the outward points (go inward in inward graph)
118 |             // but do not re-visit the outward nodes or the inward nodes again
119 | 
120 |             for surface_point_id in &visited_outward {
121 |                 self.dfs_and_visit_subgraph(
122 |                     *surface_point_id,
123 |                     &mut visited_outward_side_effects,
124 |                     context,
125 |                     &inward_callgraph,
126 |                     visitor,
127 |                     CurrentDFSVector::OutwardSideEffect,
128 |                     Some(&blacklisted),
129 |                 )?;
130 |             }
131 |         }
132 | 
133 |         Ok(())
134 |     }
135 | 
136 |     #[allow(clippy::too_many_arguments)]
137 |     pub(super) fn dfs_and_visit_subgraph<T>(
138 |         &self,
139 |         node_id: NodeID,
140 |         visited: &mut HashSet<NodeID>,
141 |         context: &WorkspaceContext,
142 |         callgraph: &RawCallGraph,
143 |         visitor: &mut T,
144 |         current_investigation_direction: CurrentDFSVector,
145 |         blacklist: Option<&HashSet<NodeID>>,
146 |     ) -> super::Result<()>
147 |     where
148 |         T: CallGraphVisitor,
149 |     {
150 |         if visited.contains(&node_id) {
151 |             return Ok(());
152 |         }
153 | 
154 |         visited.insert(node_id);
155 | 
156 |         if let Some(blacklist) = blacklist {
157 |             if !blacklist.contains(&node_id) {
158 |                 self.make_relevant_visit_call(
159 |                     context,
160 |                     node_id,
161 |                     visitor,
162 |                     current_investigation_direction,
163 |                 )?;
164 |             }
165 |         } else {
166 |             self.make_relevant_visit_call(
167 |                 context,
168 |                 node_id,
169 |                 visitor,
170 |                 current_investigation_direction,
171 |             )?;
172 |         }
173 | 
174 |         if let Some(pointing_to) = callgraph.get(&node_id) {
175 |             for destination in pointing_to {
176 |                 self.dfs_and_visit_subgraph(
177 |                     *destination,
178 |                     visited,
179 |                     context,
180 |                     callgraph,
181 |                     visitor,
182 |                     current_investigation_direction,
183 |                     blacklist,
184 |                 )?;
185 |             }
186 |         }
187 |         Ok(())
188 |     }
189 | 
190 |     pub(super) fn make_relevant_visit_call<T>(
191 |         &self,
192 |         context: &WorkspaceContext,
193 |         node_id: NodeID,
194 |         visitor: &mut T,
195 |         current_investigation_direction: CurrentDFSVector,
196 |     ) -> super::Result<()>
197 |     where
198 |         T: CallGraphVisitor,
199 |     {
200 |         if let Some(node) = context.nodes.get(&node_id) {
201 |             if node.node_type() != NodeType::FunctionDefinition
202 |                 && node.node_type() != NodeType::ModifierDefinition
203 |             {
204 |                 return Ok(());
205 |             }
206 | 
207 |             match current_investigation_direction {
208 |                 CurrentDFSVector::Inward => {
209 |                     if let ASTNode::FunctionDefinition(function) = node {
210 |                         visitor
211 |                             .visit_inward_function_definition(function)
212 |                             .map_err(|_| super::Error::InwardFunctionDefinitionVisitError)?;
213 |                     }
214 |                     if let ASTNode::ModifierDefinition(modifier) = node {
215 |                         visitor
216 |                             .visit_inward_modifier_definition(modifier)
217 |                             .map_err(|_| super::Error::InwardModifierDefinitionVisitError)?;
218 |                     }
219 |                 }
220 |                 CurrentDFSVector::Outward => {
221 |                     if let ASTNode::FunctionDefinition(function) = node {
222 |                         visitor
223 |                             .visit_outward_function_definition(function)
224 |                             .map_err(|_| super::Error::OutwardFunctionDefinitionVisitError)?;
225 |                     }
226 |                     if let ASTNode::ModifierDefinition(modifier) = node {
227 |                         visitor
228 |                             .visit_outward_modifier_definition(modifier)
229 |                             .map_err(|_| super::Error::OutwardModifierDefinitionVisitError)?;
230 |                     }
231 |                 }
232 |                 CurrentDFSVector::OutwardSideEffect => {
233 |                     if let ASTNode::FunctionDefinition(function) = node {
234 |                         visitor.visit_outward_side_effect_function_definition(function).map_err(
235 |                             |_| super::Error::OutwardSideEffectFunctionDefinitionVisitError,
236 |                         )?;
237 |                     }
238 |                     if let ASTNode::ModifierDefinition(modifier) = node {
239 |                         visitor.visit_outward_side_effect_modifier_definition(modifier).map_err(
240 |                             |_| super::Error::OutwardSideEffectModifierDefinitionVisitError,
241 |                         )?;
242 |                     }
243 |                 }
244 |             }
245 |         }
246 | 
247 |         Ok(())
248 |     }
249 | 
250 |     pub(super) fn make_entry_point_visit_call<T>(
251 |         &self,
252 |         context: &WorkspaceContext,
253 |         node_id: NodeID,
254 |         visitor: &mut T,
255 |     ) -> super::Result<()>
256 |     where
257 |         T: CallGraphVisitor,
258 |     {
259 |         let node = context.nodes.get(&node_id).ok_or(super::Error::InvalidEntryPointId(node_id))?;
260 |         visitor.visit_entry_point(node).map_err(|_| super::Error::EntryPointVisitError)?;
261 |         Ok(())
262 |     }
263 | }
264 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/detect/low/unused_import.rs:
--------------------------------------------------------------------------------

```rust
  1 | use std::{collections::BTreeMap, error::Error};
  2 | 
  3 | use crate::ast::{ASTNode, NodeID, NodeType};
  4 | 
  5 | use crate::{
  6 |     capture,
  7 |     context::{
  8 |         browser::{ExtractReferencedDeclarationsConditionally, GetClosestAncestorOfTypeX},
  9 |         workspace::WorkspaceContext,
 10 |     },
 11 |     detect::detector::{IssueDetector, IssueDetectorNamePool, IssueSeverity},
 12 | };
 13 | use eyre::Result;
 14 | 
 15 | use self::source_unit_graph_analysis::Graph;
 16 | 
 17 | #[derive(Default)]
 18 | pub struct UnusedImportDetector {
 19 |     // Keys are: [0] source file name, [1] line number, [2] character location of node.
 20 |     // Do not add items manually, use `capture!` to add nodes to this BTreeMap.
 21 |     found_instances: BTreeMap<(String, usize, String), NodeID>,
 22 | }
 23 | 
 24 | impl IssueDetector for UnusedImportDetector {
 25 |     fn detect(&mut self, context: &WorkspaceContext) -> Result<bool, Box<dyn Error>> {
 26 |         let mut graph = Graph::new();
 27 | 
 28 |         for source_unit in context.source_units() {
 29 |             for imported_source_unit in source_unit.import_directives() {
 30 |                 let imported_symbols = imported_source_unit
 31 |                     .symbol_aliases
 32 |                     .iter()
 33 |                     .flat_map(|s| s.foreign.referenced_declaration)
 34 |                     .collect::<Vec<_>>();
 35 | 
 36 |                 let imported_source_unit_id = imported_source_unit.source_unit;
 37 | 
 38 |                 if imported_symbols.is_empty() {
 39 |                     // This means it's not a named import, so technically we're importing
 40 |                     // everything that the source unit exports
 41 |                     if let Some(ASTNode::SourceUnit(i)) =
 42 |                         context.nodes.get(&imported_source_unit_id)
 43 |                         && let Some(exported_symbols) = i.exported_symbols.as_ref()
 44 |                     {
 45 |                         let exported_symbols =
 46 |                             exported_symbols.values().flatten().collect::<Vec<_>>();
 47 |                         // Create a relationship from source_unit -> imported source unit FOR
 48 |                         // ALL exported_symbols
 49 | 
 50 |                         graph.create_relationship_for_symbols(
 51 |                             source_unit.id,
 52 |                             imported_source_unit_id,
 53 |                             imported_source_unit.id,
 54 |                             exported_symbols.into_iter().cloned().collect::<Vec<_>>(),
 55 |                         );
 56 |                     }
 57 |                 } else {
 58 |                     // This is a names import and we're only importing specific symbols
 59 |                     graph.create_relationship_for_symbols(
 60 |                         source_unit.id,
 61 |                         imported_source_unit_id,
 62 |                         imported_source_unit.id,
 63 |                         imported_symbols,
 64 |                     );
 65 |                 }
 66 |             }
 67 |         }
 68 | 
 69 |         for source_unit in context.source_units() {
 70 |             let referenced_declarations = ExtractReferencedDeclarationsConditionally::from(
 71 |                 source_unit,
 72 |                 context,
 73 |                 Box::new(|node_id, context| {
 74 |                     if let Some(node) = context.nodes.get(&node_id) {
 75 |                         return node
 76 |                             .closest_ancestor_of_type(context, NodeType::ImportDirective)
 77 |                             .is_none();
 78 |                     }
 79 |                     false
 80 |                 }),
 81 |             )
 82 |             .extracted;
 83 | 
 84 |             for referenced_symbol in referenced_declarations {
 85 |                 graph.mark_used_pathways(source_unit.id, referenced_symbol);
 86 |                 if let Some(symbol_place) = context.nodes.get(&referenced_symbol)
 87 |                     && let Some(ASTNode::ContractDefinition(contract)) =
 88 |                         symbol_place.closest_ancestor_of_type(context, NodeType::ContractDefinition)
 89 |                 {
 90 |                     graph.mark_used_pathways(source_unit.id, contract.id);
 91 |                 }
 92 |             }
 93 |         }
 94 | 
 95 |         for unused_import_id in graph.collect_unused_imports() {
 96 |             if let Some(node) = context.nodes.get(&unused_import_id) {
 97 |                 capture!(self, context, node);
 98 |             }
 99 |         }
100 |         Ok(!self.found_instances.is_empty())
101 |     }
102 | 
103 |     fn severity(&self) -> IssueSeverity {
104 |         IssueSeverity::Low
105 |     }
106 | 
107 |     fn title(&self) -> String {
108 |         String::from("Unused Import")
109 |     }
110 | 
111 |     fn description(&self) -> String {
112 |         String::from("Redundant import statement. Consider removing it.")
113 |     }
114 | 
115 |     fn instances(&self) -> BTreeMap<(String, usize, String), NodeID> {
116 |         self.found_instances.clone()
117 |     }
118 | 
119 |     fn name(&self) -> String {
120 |         format!("{}", IssueDetectorNamePool::UnusedImport)
121 |     }
122 | }
123 | 
124 | mod source_unit_graph_analysis {
125 | 
126 |     //! Goal of this module is to create a graphical representation of all the source units
127 |     //! connected  with import statements.
128 |     //!
129 |     //! Will be used to detect unused imports
130 | 
131 |     use std::collections::{HashMap, HashSet};
132 | 
133 |     use crate::ast::NodeID;
134 | 
135 |     #[derive(Default, Debug)]
136 |     pub struct GNode {
137 |         #[allow(dead_code)]
138 |         source_unit: NodeID,
139 |         edges: Vec<GEdge>,
140 |     }
141 | 
142 |     #[derive(Default, Debug)]
143 |     pub struct GEdge {
144 |         symbols: Vec<NodeID>,
145 |         to: NodeID,
146 |         import_statement: NodeID,
147 |     }
148 | 
149 |     #[derive(Default, Debug)]
150 |     pub struct Graph {
151 |         /// Key source units: source unit ID
152 |         source_units: HashMap<NodeID, GNode>,
153 | 
154 |         /// Key: Import Statement, Value: Symbol that is imported
155 |         useful_symbols: HashMap<NodeID, Vec<NodeID>>,
156 |     }
157 | 
158 |     impl Graph {
159 |         pub fn new() -> Self {
160 |             Graph::default()
161 |         }
162 | 
163 |         /// Each relationship edge corresponds to an import statement in `from` source unit that
164 |         /// imports symbols `symbols` from `to` source unit
165 |         pub fn create_relationship_for_symbols(
166 |             &mut self,
167 |             from_source_unit: NodeID,
168 |             to_source_unit: NodeID,
169 |             import_statement: NodeID,
170 |             symbols: Vec<NodeID>,
171 |         ) {
172 |             // First we try to find the GNode with corresponding to the source unit. If we do we
173 |             // return it's index in the graph otherwise, we insert a GNode
174 | 
175 |             let from_node = self
176 |                 .source_units
177 |                 .entry(from_source_unit)
178 |                 .or_insert_with(|| GNode { source_unit: to_source_unit, edges: vec![] });
179 | 
180 |             // Create the relationship edge
181 |             let relationship = GEdge { symbols, to: to_source_unit, import_statement };
182 | 
183 |             from_node.edges.push(relationship);
184 | 
185 |             // Make sure the `to` source unit node is present in the graph
186 |             _ = self
187 |                 .source_units
188 |                 .entry(to_source_unit)
189 |                 .or_insert_with(|| GNode { source_unit: to_source_unit, edges: vec![] });
190 |         }
191 | 
192 |         pub fn mark_used_pathways(
193 |             &mut self,
194 |             source_unit_id: NodeID,
195 |             symbol_id: NodeID,
196 |         ) -> Option<()> {
197 |             let mut visited_source_unit_ids = HashSet::new();
198 |             self.dfs(source_unit_id, symbol_id, &mut visited_source_unit_ids)?;
199 |             Some(())
200 |         }
201 | 
202 |         fn dfs(
203 |             &mut self,
204 |             source_unit: NodeID,
205 |             symbol_id: NodeID,
206 |             visited: &mut HashSet<NodeID>,
207 |         ) -> Option<()> {
208 |             if visited.contains(&source_unit) {
209 |                 return Some(());
210 |             }
211 | 
212 |             visited.insert(source_unit);
213 | 
214 |             let s = self.source_units.get(&source_unit)?;
215 |             let mut to_ids = vec![];
216 | 
217 |             for relationship in &s.edges {
218 |                 if relationship.symbols.contains(&symbol_id) {
219 |                     self.useful_symbols
220 |                         .entry(relationship.import_statement)
221 |                         .or_default()
222 |                         .push(symbol_id);
223 |                     to_ids.push(relationship.to);
224 |                 }
225 |             }
226 | 
227 |             for to in to_ids {
228 |                 self.dfs(to, symbol_id, visited)?;
229 |             }
230 | 
231 |             Some(())
232 |         }
233 | 
234 |         pub fn collect_unused_imports(&mut self) -> Vec<NodeID> {
235 |             let mut useless_imports: Vec<_> = vec![];
236 | 
237 |             for node in self.source_units.values() {
238 |                 for relationship in &node.edges {
239 |                     if !self.useful_symbols.contains_key(&relationship.import_statement) {
240 |                         useless_imports.push(relationship.import_statement);
241 |                     }
242 |                 }
243 |             }
244 | 
245 |             useless_imports
246 |         }
247 |     }
248 | }
249 | 
250 | #[cfg(test)]
251 | mod unused_imports_tests {
252 |     use semver::Version;
253 | 
254 |     use crate::detect::{detector::IssueDetector, low::unused_import::UnusedImportDetector};
255 | 
256 |     #[test]
257 | 
258 |     fn test_unused_imports() {
259 |         let context =
260 |             crate::detect::test_utils::load_multiple_solidity_source_units_into_single_context(
261 |                 &[
262 |                     "../tests/contract-playground/src/UnusedImport.sol",
263 |                     "../tests/contract-playground/src/U2.sol",
264 |                     "../tests/contract-playground/src/U3.sol",
265 |                     "../tests/contract-playground/src/U4.sol",
266 |                     "../tests/contract-playground/src/U5.sol",
267 |                 ],
268 |                 Version::new(0, 8, 19),
269 |             );
270 | 
271 |         let mut detector = UnusedImportDetector::default();
272 |         let found = detector.detect(&context).unwrap();
273 |         assert!(found);
274 |         assert_eq!(detector.instances().len(), 2);
275 |     }
276 | }
277 | 
```

--------------------------------------------------------------------------------
/benchmarks/ecrecover/report/change/t-test.svg:
--------------------------------------------------------------------------------

```
 1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
 2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
 3 | ecrecover: Welch t test
 4 | </text>
 5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
 6 | Density
 7 | </text>
 8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 9 | t score
10 | </text>
11 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
12 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
13 | 0.0
14 | </text>
15 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
16 | <text x="77" y="420" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
17 | 0.05
18 | </text>
19 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,420 86,420 "/>
20 | <text x="77" y="368" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
21 | 0.1
22 | </text>
23 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,368 86,368 "/>
24 | <text x="77" y="316" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
25 | 0.15
26 | </text>
27 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,316 86,316 "/>
28 | <text x="77" y="263" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
29 | 0.2
30 | </text>
31 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,263 86,263 "/>
32 | <text x="77" y="211" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
33 | 0.25
34 | </text>
35 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,211 86,211 "/>
36 | <text x="77" y="159" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
37 | 0.3
38 | </text>
39 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,159 86,159 "/>
40 | <text x="77" y="107" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
41 | 0.35
42 | </text>
43 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,107 86,107 "/>
44 | <text x="77" y="54" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
45 | 0.4
46 | </text>
47 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,54 86,54 "/>
48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
49 | <text x="107" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50 | -4.0
51 | </text>
52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="107,473 107,478 "/>
53 | <text x="210" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
54 | -3.0
55 | </text>
56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="210,473 210,478 "/>
57 | <text x="314" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
58 | -2.0
59 | </text>
60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="314,473 314,478 "/>
61 | <text x="417" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
62 | -1.0
63 | </text>
64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="417,473 417,478 "/>
65 | <text x="520" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
66 | 0.0
67 | </text>
68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="520,473 520,478 "/>
69 | <text x="623" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70 | 1.0
71 | </text>
72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="623,473 623,478 "/>
73 | <text x="727" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
74 | 2.0
75 | </text>
76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="727,473 727,478 "/>
77 | <text x="830" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
78 | 3.0
79 | </text>
80 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="830,473 830,478 "/>
81 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 88,472 90,472 92,472 93,472 95,472 97,472 98,472 100,472 102,472 103,472 105,472 107,472 109,472 110,472 112,472 114,472 115,472 117,472 119,472 120,472 122,472 124,472 125,472 127,472 129,472 131,472 132,472 134,472 136,472 137,472 139,472 141,472 142,472 144,472 146,472 147,472 149,472 151,472 153,472 154,472 156,472 158,472 159,472 161,472 163,472 164,472 166,472 168,472 169,472 171,472 173,472 175,472 176,472 178,472 180,472 181,472 183,472 185,472 186,472 188,472 190,472 191,472 193,472 195,471 197,471 198,471 200,471 202,471 203,471 205,471 207,471 208,471 210,471 212,470 214,470 215,470 217,470 219,470 220,470 222,470 224,469 225,469 227,469 229,469 230,468 232,468 234,468 236,467 237,467 239,467 241,466 242,466 244,465 246,465 247,464 249,464 251,463 252,463 254,462 256,461 258,461 259,460 261,459 263,458 264,458 266,457 268,456 269,455 271,454 273,453 274,451 276,450 278,449 280,448 281,447 283,445 285,444 286,442 288,441 290,439 291,438 293,436 295,435 296,433 298,431 300,429 302,428 303,426 305,424 307,422 308,419 310,417 312,415 313,412 315,410 317,407 318,405 320,402 322,399 324,396 325,393 327,390 329,387 330,384 332,381 334,378 335,375 337,372 339,368 341,365 342,362 344,358 346,355 347,352 349,348 351,345 352,341 354,338 356,334 357,331 359,327 361,324 363,320 364,317 366,313 368,309 369,306 371,302 373,298 374,294 376,290 378,286 379,282 381,278 383,274 385,270 386,266 388,263 390,259 391,255 393,252 395,248 396,245 398,242 400,238 401,235 403,232 405,229 407,226 408,222 410,219 412,216 413,213 415,209 417,206 418,203 420,199 422,196 423,193 425,190 427,187 429,184 430,181 432,178 434,175 435,172 437,169 439,166 440,163 442,160 444,157 445,154 447,151 449,148 451,145 452,142 454,139 456,136 457,134 459,131 461,129 462,127 464,124 466,122 468,120 469,118 471,117 473,115 474,113 476,111 478,109 479,108 481,106 483,105 484,104 486,102 488,101 490,100 491,99 493,98 495,98 496,97 498,96 500,95 501,95 503,94 505,93 506,93 508,92 510,92 512,92 513,92 515,92 517,92 518,92 520,92 522,92 523,92 525,92 527,92 528,92 530,92 532,92 534,92 535,92 537,93 539,93 540,94 542,95 544,96 545,97 547,98 549,100 550,101 552,103 554,105 556,107 557,108 559,110 561,112 562,114 564,115 566,117 567,119 569,121 571,122 573,124 574,126 576,128 578,130 579,132 581,135 583,137 584,140 586,142 588,145 589,148 591,150 593,153 595,156 596,158 598,161 600,164 601,167 603,169 605,172 606,175 608,177 610,180 611,183 613,186 615,188 617,191 618,194 620,197 622,200 623,203 625,206 627,209 628,212 630,215 632,218 633,221 635,225 637,228 639,232 640,235 642,239 644,243 645,246 647,250 649,254 650,258 652,262 654,266 655,271 657,275 659,279 661,283 662,287 664,291 666,295 667,299 669,303 671,307 672,311 674,315 676,319 677,323 679,326 681,330 683,333 684,337 686,340 688,343 689,346 691,349 693,352 694,355 696,358 698,362 700,365 701,368 703,371 705,374 706,377 708,380 710,384 711,387 713,390 715,393 716,396 718,398 720,401 722,404 723,406 725,408 727,411 728,413 730,415 732,417 733,419 735,421 737,424 738,426 740,428 742,430 744,432 745,434 747,435 749,437 750,439 752,441 754,443 755,444 757,446 759,447 760,449 762,450 764,451 766,452 767,453 769,454 771,455 772,456 774,457 776,458 777,459 779,460 781,460 782,461 784,462 786,462 788,463 789,464 791,464 793,465 794,465 796,465 798,466 799,466 801,466 803,467 804,467 806,467 808,468 810,468 811,468 813,468 815,469 816,469 818,469 820,469 821,470 823,470 825,470 827,470 828,470 830,470 832,471 833,471 835,471 837,471 838,471 840,471 842,471 843,472 845,472 847,472 849,472 850,472 852,472 854,472 855,472 857,472 859,472 860,472 862,472 864,472 865,472 867,472 869,472 871,472 872,472 874,472 876,472 877,472 879,472 881,472 882,472 884,472 886,472 887,472 889,472 891,472 893,472 894,472 896,472 898,472 899,472 901,472 903,472 904,472 906,472 908,472 909,472 911,472 913,472 915,472 916,472 918,472 920,472 921,472 923,472 925,472 926,472 928,472 930,472 932,472 932,472 87,472 "/>
82 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="468,472 468,53 "/>
83 | <text x="842" y="250" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
84 | t distribution
85 | </text>
86 | <text x="842" y="265" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
87 | t statistic
88 | </text>
89 | <rect x="812" y="250" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
90 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="812,270 832,270 "/>
91 | </svg>
92 | 
```
Page 20/103FirstPrevNextLast