This is page 88 of 94. Use http://codebase.md/cyfrin/aderyn?lines=false&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
--------------------------------------------------------------------------------
/reports/adhoc-sol-files-report.md:
--------------------------------------------------------------------------------
```markdown
# Aderyn Analysis Report
This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities.
# Table of Contents
- [Summary](#summary)
- [Files Summary](#files-summary)
- [Files Details](#files-details)
- [Issue Summary](#issue-summary)
- [High Issues](#high-issues)
- [H-1: `delegatecall` to an Arbitrary Address](#h-1-delegatecall-to-an-arbitrary-address)
- [H-2: Unchecked Low level calls](#h-2-unchecked-low-level-calls)
- [Low Issues](#low-issues)
- [L-1: `delegatecall` in loop](#l-1-delegatecall-in-loop)
- [L-2: Centralization Risk](#l-2-centralization-risk)
- [L-3: `ecrecover` Signature Malleability](#l-3-ecrecover-signature-malleability)
- [L-4: Unspecific Solidity Pragma](#l-4-unspecific-solidity-pragma)
- [L-5: Address State Variable Set Without Checks](#l-5-address-state-variable-set-without-checks)
- [L-6: Public Function Not Used Internally](#l-6-public-function-not-used-internally)
- [L-7: Literal Instead of Constant](#l-7-literal-instead-of-constant)
- [L-8: Empty `require()` / `revert()` Statement](#l-8-empty-require--revert-statement)
- [L-9: PUSH0 Opcode](#l-9-push0-opcode)
- [L-10: Modifier Invoked Only Once](#l-10-modifier-invoked-only-once)
- [L-11: Empty Block](#l-11-empty-block)
- [L-12: Large Numeric Literal](#l-12-large-numeric-literal)
- [L-13: Internal Function Used Only Once](#l-13-internal-function-used-only-once)
- [L-14: Contract has TODO Comments](#l-14-contract-has-todo-comments)
- [L-15: Inconsistent uint256/uint (or) int256/int types](#l-15-inconsistent-uint256uint-or-int256int-types)
- [L-16: Unused Error](#l-16-unused-error)
- [L-17: Unused State Variable](#l-17-unused-state-variable)
- [L-18: Dead Code](#l-18-dead-code)
- [L-19: Unused Import](#l-19-unused-import)
- [L-20: State Variable Could Be Constant](#l-20-state-variable-could-be-constant)
- [L-21: State Change Without Event](#l-21-state-change-without-event)
- [L-22: State Variable Could Be Immutable](#l-22-state-variable-could-be-immutable)
# Summary
## Files Summary
| Key | Value |
| --- | --- |
| .sol Files | 20 |
| Total nSLOC | 245 |
## Files Details
| Filepath | nSLOC |
| --- | --- |
| Counter.sol | 20 |
| DemoASTNodes.sol | 31 |
| Helper.sol | 8 |
| InconsistentUints.sol | 17 |
| InternalFunctions.sol | 22 |
| OnceModifierExample.sol | 8 |
| StateVariables.sol | 58 |
| inheritance/ExtendedInheritance.sol | 17 |
| inheritance/IContractInheritance.sol | 4 |
| inheritance/InheritanceBase.sol | 8 |
| multiple-versions/0.4/A.sol | 5 |
| multiple-versions/0.4/B.sol | 5 |
| multiple-versions/0.5/A.sol | 5 |
| multiple-versions/0.5/B.sol | 7 |
| multiple-versions/0.6/A.sol | 5 |
| multiple-versions/0.6/B.sol | 5 |
| multiple-versions/0.7/A.sol | 5 |
| multiple-versions/0.7/B.sol | 5 |
| multiple-versions/0.8/A.sol | 5 |
| multiple-versions/0.8/B.sol | 5 |
| **Total** | **245** |
## Issue Summary
| Category | No. of Issues |
| --- | --- |
| High | 2 |
| Low | 22 |
# High Issues
## H-1: `delegatecall` to an Arbitrary Address
Making a `delegatecall` to an arbitrary address without any checks is dangerous. Consider adding requirements on the target address.
<details><summary>1 Found Instances</summary>
- Found in inheritance/ExtendedInheritance.sol [Line: 14](../tests/adhoc-sol-files/inheritance/ExtendedInheritance.sol#L14)
```solidity
function doSomethingElse(address target) external {
```
</details>
## H-2: Unchecked Low level calls
The return value of the low-level call is not checked, so if the call fails, the Ether will be locked in the contract. If the low level is used to prevent blocking operations, consider logging failed calls. Ensure that the return value of a low-level call is checked or logged.
<details><summary>1 Found Instances</summary>
- Found in inheritance/ExtendedInheritance.sol [Line: 16](../tests/adhoc-sol-files/inheritance/ExtendedInheritance.sol#L16)
```solidity
target.delegatecall(abi.encodeWithSignature("doSomething(uint256)", i));
```
</details>
# Low Issues
## L-1: `delegatecall` in loop
Using `delegatecall` in loop may consume excessive gas, or worse, lead to more severe issues.
<details><summary>1 Found Instances</summary>
- Found in inheritance/ExtendedInheritance.sol [Line: 15](../tests/adhoc-sol-files/inheritance/ExtendedInheritance.sol#L15)
```solidity
for (uint256 i = 0; i < 3; i++) {
```
</details>
## L-2: Centralization Risk
Contracts have owners with privileged rights to perform admin tasks and need to be trusted to not perform malicious updates or drain funds.
<details><summary>1 Found Instances</summary>
- Found in InternalFunctions.sol [Line: 12](../tests/adhoc-sol-files/InternalFunctions.sol#L12)
```solidity
function setValue(uint256 _newValue) external onlyOwner {
```
</details>
## L-3: `ecrecover` Signature Malleability
The `ecrecover` function is susceptible to signature malleability. This means that the same message can be signed in multiple ways, allowing an attacker to change the message signature without invalidating it. This can lead to unexpected behavior in smart contracts, such as the loss of funds or the ability to bypass access control. Consider using OpenZeppelin's ECDSA library instead of the built-in function.
<details><summary>1 Found Instances</summary>
- Found in inheritance/ExtendedInheritance.sol [Line: 21](../tests/adhoc-sol-files/inheritance/ExtendedInheritance.sol#L21)
```solidity
return ecrecover(theHash, v, r, s);
```
</details>
## L-4: Unspecific Solidity Pragma
Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;`
<details><summary>16 Found Instances</summary>
- Found in Counter.sol [Line: 2](../tests/adhoc-sol-files/Counter.sol#L2)
```solidity
pragma solidity ^0.8.13;
```
- Found in DemoASTNodes.sol [Line: 2](../tests/adhoc-sol-files/DemoASTNodes.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in Helper.sol [Line: 2](../tests/adhoc-sol-files/Helper.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in InconsistentUints.sol [Line: 1](../tests/adhoc-sol-files/InconsistentUints.sol#L1)
```solidity
pragma solidity ^0.8.24;
```
- Found in inheritance/IContractInheritance.sol [Line: 2](../tests/adhoc-sol-files/inheritance/IContractInheritance.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in inheritance/InheritanceBase.sol [Line: 2](../tests/adhoc-sol-files/inheritance/InheritanceBase.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
- Found in multiple-versions/0.4/A.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.4/A.sol#L2)
```solidity
pragma solidity ^0.4.0;
```
- Found in multiple-versions/0.4/B.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.4/B.sol#L2)
```solidity
pragma solidity ^0.4.0;
```
- Found in multiple-versions/0.5/A.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.5/A.sol#L2)
```solidity
pragma solidity ^0.5.0;
```
- Found in multiple-versions/0.5/B.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.5/B.sol#L2)
```solidity
pragma solidity ^0.5.0;
```
- Found in multiple-versions/0.6/A.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.6/A.sol#L2)
```solidity
pragma solidity ^0.6.0;
```
- Found in multiple-versions/0.6/B.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.6/B.sol#L2)
```solidity
pragma solidity ^0.6.0;
```
- Found in multiple-versions/0.7/A.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.7/A.sol#L2)
```solidity
pragma solidity ^0.7.0;
```
- Found in multiple-versions/0.7/B.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.7/B.sol#L2)
```solidity
pragma solidity ^0.7.0;
```
- Found in multiple-versions/0.8/A.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.8/A.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
- Found in multiple-versions/0.8/B.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.8/B.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
</details>
## L-5: Address State Variable Set Without Checks
Check for `address(0)` when assigning values to address state variables.
<details><summary>1 Found Instances</summary>
- Found in StateVariables.sol [Line: 58](../tests/adhoc-sol-files/StateVariables.sol#L58)
```solidity
addr = newAddr;
```
</details>
## L-6: Public Function Not Used Internally
If a function is marked public but is not used internally, consider marking it as `external`.
<details><summary>6 Found Instances</summary>
- Found in Counter.sol [Line: 7](../tests/adhoc-sol-files/Counter.sol#L7)
```solidity
function setNumber(uint256 newNumber) public {
```
- Found in StateVariables.sol [Line: 47](../tests/adhoc-sol-files/StateVariables.sol#L47)
```solidity
function setAddrNoZeroError(address newAddr) public {
```
- Found in StateVariables.sol [Line: 52](../tests/adhoc-sol-files/StateVariables.sol#L52)
```solidity
function setAddrNoZeroRequire(address newAddr) public {
```
- Found in StateVariables.sol [Line: 57](../tests/adhoc-sol-files/StateVariables.sol#L57)
```solidity
function setAddrNoCheck(address newAddr) public {
```
- Found in StateVariables.sol [Line: 61](../tests/adhoc-sol-files/StateVariables.sol#L61)
```solidity
function setEmptyAlteredNumbers(
```
- Found in StateVariables.sol [Line: 71](../tests/adhoc-sol-files/StateVariables.sol#L71)
```solidity
function setNonEmptyAlteredNumbers(
```
</details>
## L-7: Literal Instead of Constant
Define and use `constant` variables instead of using literals. If the same constant literal value is used multiple times, create a constant state variable and reference it throughout the contract.
<details><summary>6 Found Instances</summary>
- Found in DemoASTNodes.sol [Line: 15](../tests/adhoc-sol-files/DemoASTNodes.sol#L15)
```solidity
if (i == 3) {
```
- Found in DemoASTNodes.sol [Line: 20](../tests/adhoc-sol-files/DemoASTNodes.sol#L20)
```solidity
if (i == 5) {
```
- Found in DemoASTNodes.sol [Line: 31](../tests/adhoc-sol-files/DemoASTNodes.sol#L31)
```solidity
uint256[] memory numbers = new uint256[](5);
```
- Found in DemoASTNodes.sol [Line: 35](../tests/adhoc-sol-files/DemoASTNodes.sol#L35)
```solidity
numbers[3] = 3;
```
- Found in DemoASTNodes.sol [Line: 36](../tests/adhoc-sol-files/DemoASTNodes.sol#L36)
```solidity
numbers[4] = 4;
```
- Found in DemoASTNodes.sol [Line: 38](../tests/adhoc-sol-files/DemoASTNodes.sol#L38)
```solidity
int256 i = 4;
```
</details>
## L-8: Empty `require()` / `revert()` Statement
Use descriptive reason strings or custom errors for revert paths.
<details><summary>1 Found Instances</summary>
- Found in DemoASTNodes.sol [Line: 7](../tests/adhoc-sol-files/DemoASTNodes.sol#L7)
```solidity
require(to != address(0));
```
</details>
## L-9: PUSH0 Opcode
Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail.
<details><summary>10 Found Instances</summary>
- Found in Counter.sol [Line: 2](../tests/adhoc-sol-files/Counter.sol#L2)
```solidity
pragma solidity ^0.8.13;
```
- Found in DemoASTNodes.sol [Line: 2](../tests/adhoc-sol-files/DemoASTNodes.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in Helper.sol [Line: 2](../tests/adhoc-sol-files/Helper.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in InconsistentUints.sol [Line: 1](../tests/adhoc-sol-files/InconsistentUints.sol#L1)
```solidity
pragma solidity ^0.8.24;
```
- Found in StateVariables.sol [Line: 2](../tests/adhoc-sol-files/StateVariables.sol#L2)
```solidity
pragma solidity 0.8.20;
```
- Found in inheritance/ExtendedInheritance.sol [Line: 2](../tests/adhoc-sol-files/inheritance/ExtendedInheritance.sol#L2)
```solidity
pragma solidity 0.8.20;
```
- Found in inheritance/IContractInheritance.sol [Line: 2](../tests/adhoc-sol-files/inheritance/IContractInheritance.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in inheritance/InheritanceBase.sol [Line: 2](../tests/adhoc-sol-files/inheritance/InheritanceBase.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
- Found in multiple-versions/0.8/A.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.8/A.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
- Found in multiple-versions/0.8/B.sol [Line: 2](../tests/adhoc-sol-files/multiple-versions/0.8/B.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
</details>
## L-10: Modifier Invoked Only Once
Consider removing the modifier or inlining the logic into the calling function.
<details><summary>3 Found Instances</summary>
- Found in DemoASTNodes.sol [Line: 6](../tests/adhoc-sol-files/DemoASTNodes.sol#L6)
```solidity
modifier iHaveAPlaceholder(address to) {
```
- Found in InternalFunctions.sol [Line: 18](../tests/adhoc-sol-files/InternalFunctions.sol#L18)
```solidity
modifier onlyOwner() {
```
- Found in OnceModifierExample.sol [Line: 6](../tests/adhoc-sol-files/OnceModifierExample.sol#L6)
```solidity
modifier onlyOnce() {
```
</details>
## L-11: Empty Block
Consider removing empty blocks.
<details><summary>2 Found Instances</summary>
- Found in OnceModifierExample.sol [Line: 10](../tests/adhoc-sol-files/OnceModifierExample.sol#L10)
```solidity
function perform() external onlyOnce {
```
- Found in multiple-versions/0.5/B.sol [Line: 8](../tests/adhoc-sol-files/multiple-versions/0.5/B.sol#L8)
```solidity
function emptyBlockCatchMe() external {
```
</details>
## L-12: Large Numeric Literal
Large literal values multiples of 10000 can be replaced with scientific notation.Use `e` notation, for example: `1e18`, instead of its full numeric value.
<details><summary>1 Found Instances</summary>
- Found in DemoASTNodes.sol [Line: 14](../tests/adhoc-sol-files/DemoASTNodes.sol#L14)
```solidity
for (uint256 i = 0; i < 10000000; ++i) {
```
</details>
## L-13: Internal Function Used Only Once
Instead of separating the logic into a separate function, consider inlining the logic into the calling function. This can reduce the number of function calls and improve readability.
<details><summary>1 Found Instances</summary>
- Found in InternalFunctions.sol [Line: 28](../tests/adhoc-sol-files/InternalFunctions.sol#L28)
```solidity
function internalSet2(uint256 _newValue) internal {
```
</details>
## L-14: Contract has TODO Comments
Contract contains comments with TODOS. Consider implementing or removing them.
<details><summary>1 Found Instances</summary>
- Found in Counter.sol [Line: 4](../tests/adhoc-sol-files/Counter.sol#L4)
```solidity
contract Counter {
```
</details>
## L-15: Inconsistent uint256/uint (or) int256/int types
Inconsistency in declaring uint256/uint (or) int256/int variables within a contract. Use explicit size declarations (uint256 or int256). Consider keeping the naming convention consistent in a given contract. Explicit size declarations are preferred (uint256, int256) over implicit ones (uint, int) to avoid confusion.
<details><summary>7 Found Instances</summary>
- Found in InconsistentUints.sol [Line: 5](../tests/adhoc-sol-files/InconsistentUints.sol#L5)
```solidity
uint public uintVariable; // 1
```
- Found in InconsistentUints.sol [Line: 7](../tests/adhoc-sol-files/InconsistentUints.sol#L7)
```solidity
int public intVariable; // 1
```
- Found in InconsistentUints.sol [Line: 11](../tests/adhoc-sol-files/InconsistentUints.sol#L11)
```solidity
uint personUint; // 2
```
- Found in InconsistentUints.sol [Line: 12](../tests/adhoc-sol-files/InconsistentUints.sol#L12)
```solidity
mapping (uint => uint256) personMap; // 3 2
```
- Found in InconsistentUints.sol [Line: 15](../tests/adhoc-sol-files/InconsistentUints.sol#L15)
```solidity
uint[] public uintArray; // 4
```
- Found in InconsistentUints.sol [Line: 16](../tests/adhoc-sol-files/InconsistentUints.sol#L16)
```solidity
mapping(uint256 => uint other) u2uMapping; // 5 3
```
- Found in InconsistentUints.sol [Line: 19](../tests/adhoc-sol-files/InconsistentUints.sol#L19)
```solidity
constructor(uint _uintInitial, uint256 _uint256Initial) { // 6 4
```
</details>
## L-16: Unused Error
Consider using or removing the unused error.
<details><summary>1 Found Instances</summary>
- Found in Helper.sol [Line: 8](../tests/adhoc-sol-files/Helper.sol#L8)
```solidity
error NotNice();
```
</details>
## L-17: Unused State Variable
State variable appears to be unused. No analysis has been performed to see if any inline assembly references it. Consider removing this unused variable.
<details><summary>7 Found Instances</summary>
- Found in InconsistentUints.sol [Line: 16](../tests/adhoc-sol-files/InconsistentUints.sol#L16)
```solidity
mapping(uint256 => uint other) u2uMapping; // 5 3
```
- Found in StateVariables.sol [Line: 8](../tests/adhoc-sol-files/StateVariables.sol#L8)
```solidity
uint256 private staticPrivateNumber;
```
- Found in StateVariables.sol [Line: 9](../tests/adhoc-sol-files/StateVariables.sol#L9)
```solidity
uint256 internal staticInternalNumber;
```
- Found in StateVariables.sol [Line: 13](../tests/adhoc-sol-files/StateVariables.sol#L13)
```solidity
uint256 private staticNonEmptyPrivateNumber = 1;
```
- Found in StateVariables.sol [Line: 14](../tests/adhoc-sol-files/StateVariables.sol#L14)
```solidity
uint256 internal staticNonEmptyInternalNumber = 2;
```
- Found in StateVariables.sol [Line: 28](../tests/adhoc-sol-files/StateVariables.sol#L28)
```solidity
uint256 private constant PRIVATE_CONSTANT = 1;
```
- Found in StateVariables.sol [Line: 29](../tests/adhoc-sol-files/StateVariables.sol#L29)
```solidity
uint256 internal constant INTERNAL_CONSTANT = 2;
```
</details>
## L-18: Dead Code
Functions that are not used. Consider removing them.
<details><summary>2 Found Instances</summary>
- Found in DemoASTNodes.sol [Line: 12](../tests/adhoc-sol-files/DemoASTNodes.sol#L12)
```solidity
function useBreakAndContinueStatement(address x) internal pure iHaveAPlaceholder(x) returns(uint256 sum) {
```
- Found in DemoASTNodes.sol [Line: 30](../tests/adhoc-sol-files/DemoASTNodes.sol#L30)
```solidity
function calculateSumUsingDoWhileLoop() internal pure returns(uint256 sum) {
```
</details>
## L-19: Unused Import
Redundant import statement. Consider removing it.
<details><summary>1 Found Instances</summary>
- Found in StateVariables.sol [Line: 4](../tests/adhoc-sol-files/StateVariables.sol#L4)
```solidity
import {Counter} from "./Counter.sol";
```
</details>
## L-20: State Variable Could Be Constant
State variables that are not updated following deployment should be declared constant to save gas. Add the `constant` attribute to state variables that never change.
<details><summary>5 Found Instances</summary>
- Found in StateVariables.sol [Line: 13](../tests/adhoc-sol-files/StateVariables.sol#L13)
```solidity
uint256 private staticNonEmptyPrivateNumber = 1;
```
- Found in StateVariables.sol [Line: 14](../tests/adhoc-sol-files/StateVariables.sol#L14)
```solidity
uint256 internal staticNonEmptyInternalNumber = 2;
```
- Found in StateVariables.sol [Line: 15](../tests/adhoc-sol-files/StateVariables.sol#L15)
```solidity
uint256 public staticNonEmptyPublicNumber = 3;
```
- Found in multiple-versions/0.8/B.sol [Line: 5](../tests/adhoc-sol-files/multiple-versions/0.8/B.sol#L5)
```solidity
address public MY_ADDRESS = address(0);
```
- Found in multiple-versions/0.8/B.sol [Line: 6](../tests/adhoc-sol-files/multiple-versions/0.8/B.sol#L6)
```solidity
uint256 public MY_UINT = 134131;
```
</details>
## L-21: State Change Without Event
There are state variable changes in this function but no event is emitted. Consider emitting an event to enable offchain indexers to track the changes.
<details><summary>11 Found Instances</summary>
- Found in Counter.sol [Line: 7](../tests/adhoc-sol-files/Counter.sol#L7)
```solidity
function setNumber(uint256 newNumber) public {
```
- Found in Counter.sol [Line: 11](../tests/adhoc-sol-files/Counter.sol#L11)
```solidity
function increment() public {
```
- Found in Counter.sol [Line: 16](../tests/adhoc-sol-files/Counter.sol#L16)
```solidity
function callIncrement() external {
```
- Found in Counter.sol [Line: 21](../tests/adhoc-sol-files/Counter.sol#L21)
```solidity
function incrementByTwoMagic() external {
```
- Found in Counter.sol [Line: 28](../tests/adhoc-sol-files/Counter.sol#L28)
```solidity
function incrementByTwoConstant() external {
```
- Found in InternalFunctions.sol [Line: 12](../tests/adhoc-sol-files/InternalFunctions.sol#L12)
```solidity
function setValue(uint256 _newValue) external onlyOwner {
```
- Found in StateVariables.sol [Line: 47](../tests/adhoc-sol-files/StateVariables.sol#L47)
```solidity
function setAddrNoZeroError(address newAddr) public {
```
- Found in StateVariables.sol [Line: 52](../tests/adhoc-sol-files/StateVariables.sol#L52)
```solidity
function setAddrNoZeroRequire(address newAddr) public {
```
- Found in StateVariables.sol [Line: 57](../tests/adhoc-sol-files/StateVariables.sol#L57)
```solidity
function setAddrNoCheck(address newAddr) public {
```
- Found in StateVariables.sol [Line: 61](../tests/adhoc-sol-files/StateVariables.sol#L61)
```solidity
function setEmptyAlteredNumbers(
```
- Found in StateVariables.sol [Line: 71](../tests/adhoc-sol-files/StateVariables.sol#L71)
```solidity
function setNonEmptyAlteredNumbers(
```
</details>
## L-22: State Variable Could Be Immutable
State variables that are only changed in the constructor should be declared immutable to save gas. Add the `immutable` attribute to state variables that are only changed in the constructor
<details><summary>3 Found Instances</summary>
- Found in InconsistentUints.sol [Line: 5](../tests/adhoc-sol-files/InconsistentUints.sol#L5)
```solidity
uint public uintVariable; // 1
```
- Found in InconsistentUints.sol [Line: 6](../tests/adhoc-sol-files/InconsistentUints.sol#L6)
```solidity
uint256 public uint256Variable; // 1
```
- Found in InternalFunctions.sol [Line: 5](../tests/adhoc-sol-files/InternalFunctions.sol#L5)
```solidity
address public owner;
```
</details>
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/workspace.rs:
--------------------------------------------------------------------------------
```rust
use super::{
browser::GetImmediateParent,
capturable::Capturable,
graph::{LegacyWorkspaceCallGraph, WorkspaceCallGraphs},
macros::generate_get_source_unit,
router::Router,
};
pub use crate::ast::ASTNode;
use crate::{ast::*, stats::IgnoreLine};
use solidity_ast::EvmVersion;
use std::{
cmp::Ordering,
collections::{HashMap, HashSet},
path::PathBuf,
};
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
pub struct NodeContext {
pub source_unit_id: NodeID,
pub contract_definition_id: Option<NodeID>,
pub function_definition_id: Option<NodeID>,
pub modifier_definition_id: Option<NodeID>,
}
#[derive(Default, Debug)]
pub struct WorkspaceContext {
pub last_source_unit_id: NodeID,
pub last_contract_definition_id: Option<NodeID>,
pub last_function_definition_id: Option<NodeID>,
pub last_modifier_definition_id: Option<NodeID>,
pub parent_link: HashMap<NodeID, NodeID>,
pub evm_version: EvmVersion,
// relative source filepaths
pub src_filepaths: Vec<String>,
pub sloc_stats: HashMap<String, usize>,
pub ignore_lines_stats: HashMap<String, Vec<IgnoreLine>>,
pub nodes: HashMap<NodeID, ASTNode>,
// Legacy callgraphs
pub inward_callgraph: Option<LegacyWorkspaceCallGraph>,
pub outward_callgraph: Option<LegacyWorkspaceCallGraph>,
// Callgraphs
pub callgraphs: Option<WorkspaceCallGraphs>,
// Source units
pub source_units_context: Vec<SourceUnit>,
// In-scope files
pub included: HashSet<PathBuf>,
// Function router
pub router: Option<Router>,
// Hashmaps of all nodes => source_unit_id
pub(crate) array_type_names_context: HashMap<ArrayTypeName, NodeContext>,
pub(crate) assignments_context: HashMap<Assignment, NodeContext>,
pub(crate) binary_operations_context: HashMap<BinaryOperation, NodeContext>,
pub(crate) blocks_context: HashMap<Block, NodeContext>,
pub(crate) conditionals_context: HashMap<Conditional, NodeContext>,
pub(crate) contract_definitions_context: HashMap<ContractDefinition, NodeContext>,
pub(crate) elementary_type_names_context: HashMap<ElementaryTypeName, NodeContext>,
pub(crate) elementary_type_name_expressions_context:
HashMap<ElementaryTypeNameExpression, NodeContext>,
pub(crate) emit_statements_context: HashMap<EmitStatement, NodeContext>,
pub(crate) enum_definitions_context: HashMap<EnumDefinition, NodeContext>,
pub(crate) enum_values_context: HashMap<EnumValue, NodeContext>,
pub(crate) event_definitions_context: HashMap<EventDefinition, NodeContext>,
pub(crate) error_definitions_context: HashMap<ErrorDefinition, NodeContext>,
pub(crate) expression_statements_context: HashMap<ExpressionStatement, NodeContext>,
pub(crate) function_calls_context: HashMap<FunctionCall, NodeContext>,
pub(crate) function_call_options_context: HashMap<FunctionCallOptions, NodeContext>,
pub(crate) function_definitions_context: HashMap<FunctionDefinition, NodeContext>,
pub(crate) function_type_names_context: HashMap<FunctionTypeName, NodeContext>,
pub(crate) for_statements_context: HashMap<ForStatement, NodeContext>,
pub(crate) identifiers_context: HashMap<Identifier, NodeContext>,
pub(crate) identifier_paths_context: HashMap<IdentifierPath, NodeContext>,
pub(crate) if_statements_context: HashMap<IfStatement, NodeContext>,
pub(crate) import_directives_context: HashMap<ImportDirective, NodeContext>,
pub(crate) index_accesses_context: HashMap<IndexAccess, NodeContext>,
pub(crate) index_range_accesses_context: HashMap<IndexRangeAccess, NodeContext>,
pub(crate) inheritance_specifiers_context: HashMap<InheritanceSpecifier, NodeContext>,
pub(crate) inline_assemblies_context: HashMap<InlineAssembly, NodeContext>,
pub(crate) literals_context: HashMap<Literal, NodeContext>,
pub(crate) member_accesses_context: HashMap<MemberAccess, NodeContext>,
pub(crate) new_expressions_context: HashMap<NewExpression, NodeContext>,
pub(crate) mappings_context: HashMap<Mapping, NodeContext>,
pub(crate) modifier_definitions_context: HashMap<ModifierDefinition, NodeContext>,
pub(crate) modifier_invocations_context: HashMap<ModifierInvocation, NodeContext>,
pub(crate) override_specifiers_context: HashMap<OverrideSpecifier, NodeContext>,
pub(crate) parameter_lists_context: HashMap<ParameterList, NodeContext>,
pub(crate) pragma_directives_context: HashMap<PragmaDirective, NodeContext>,
pub(crate) returns_context: HashMap<Return, NodeContext>,
pub(crate) revert_statements_context: HashMap<RevertStatement, NodeContext>,
pub(crate) struct_definitions_context: HashMap<StructDefinition, NodeContext>,
pub(crate) structured_documentations_context: HashMap<StructuredDocumentation, NodeContext>,
pub(crate) try_statements_context: HashMap<TryStatement, NodeContext>,
pub(crate) try_catch_clauses_context: HashMap<TryCatchClause, NodeContext>,
pub(crate) tuple_expressions_context: HashMap<TupleExpression, NodeContext>,
pub(crate) unary_operations_context: HashMap<UnaryOperation, NodeContext>,
pub(crate) unchecked_blocks_context: HashMap<UncheckedBlock, NodeContext>,
pub(crate) user_defined_type_names_context: HashMap<UserDefinedTypeName, NodeContext>,
pub(crate) user_defined_value_type_definitions_context:
HashMap<UserDefinedValueTypeDefinition, NodeContext>,
pub(crate) using_for_directives_context: HashMap<UsingForDirective, NodeContext>,
pub(crate) variable_declarations_context: HashMap<VariableDeclaration, NodeContext>,
pub(crate) variable_declaration_statements_context:
HashMap<VariableDeclarationStatement, NodeContext>,
pub(crate) while_statements_context: HashMap<WhileStatement, NodeContext>,
pub(crate) do_while_statements_context: HashMap<DoWhileStatement, NodeContext>,
pub(crate) break_statements_context: HashMap<Break, NodeContext>,
pub(crate) continue_statements_context: HashMap<Continue, NodeContext>,
pub(crate) placeholder_statements_context: HashMap<PlaceholderStatement, NodeContext>,
pub(crate) yul_function_calls_context: HashMap<YulFunctionCall, NodeContext>,
pub(crate) yul_identifiers_context: HashMap<YulIdentifier, NodeContext>,
pub(crate) yul_literals_context: HashMap<YulLiteral, NodeContext>,
pub(crate) yul_assignments_context: HashMap<YulAssignment, NodeContext>,
}
impl WorkspaceContext {
// Setters
pub fn set_sloc_stats(&mut self, sloc_stats: HashMap<String, usize>) {
self.sloc_stats = sloc_stats;
}
pub fn set_ignore_lines_stats(&mut self, ignore_lines_stats: HashMap<String, Vec<IgnoreLine>>) {
self.ignore_lines_stats = ignore_lines_stats;
}
// Getters
pub fn get_parent(&self, node_id: NodeID) -> Option<&ASTNode> {
self.nodes.get(self.parent_link.get(&node_id)?)
}
pub fn get_ancestral_line(&self, node_id: NodeID) -> Vec<&ASTNode> {
let mut chain = vec![];
let mut parent = self.nodes.get(&node_id);
while let Some(next_parent) = parent {
chain.push(next_parent);
parent = next_parent.parent(self);
}
chain
}
pub fn get_closest_ancestor(&self, node_id: NodeID, node_type: NodeType) -> Option<&ASTNode> {
let mut current_node_id = self.parent_link.get(&node_id)?;
while let Some(current) = self.nodes.get(current_node_id) {
if current.node_type() == node_type {
return Some(current);
}
current_node_id = self.parent_link.get(current_node_id)?;
}
None
}
pub fn get_closest_ancestor_including_self(
&self,
node_id: NodeID,
node_type: NodeType,
) -> Option<&ASTNode> {
if let Some(node) = self.nodes.get(&node_id)
&& node.node_type() == node_type
{
return Some(node);
}
self.get_closest_ancestor(node_id, node_type)
}
pub fn get_source_code_of_node(&self, node_id: NodeID) -> Option<String> {
let node = self.nodes.get(&node_id)?;
let source_unit = self.get_source_unit_from_child_node(node).unwrap();
let src_location = node.src().unwrap_or("");
let chopped_location = match src_location.rfind(':') {
Some(index) => &src_location[..index],
None => src_location, // No colon found, return the original string
}
.to_string();
if let Some((offset, len)) = chopped_location.split_once(':') {
let offset: usize = offset.parse().ok()?;
let len: usize = len.parse().ok()?;
if let Some(content) = source_unit.source.as_ref()
&& offset + len < content.len()
{
let required_content = &content[offset..offset + len];
return Some(required_content.to_string());
}
}
None
}
pub fn get_offset_and_length_of_node(&self, node_id: NodeID) -> Option<(usize, usize)> {
let node = self.nodes.get(&node_id)?;
let src_location = node.src().unwrap_or("");
let chopped_location = match src_location.rfind(':') {
Some(index) => &src_location[..index],
None => src_location, // No colon found, return the original string
}
.to_string();
if let Some((offset, len)) = chopped_location.split_once(':') {
let offset: usize = offset.parse().ok()?;
let len: usize = len.parse().ok()?;
return Some((offset, len));
}
None
}
pub fn get_node_sort_key_from_capturable(
&self,
capturable: &Capturable,
) -> (String, usize, String) {
capturable.make_key(self)
}
pub fn get_node_id_of_capturable(&self, capturable: &Capturable) -> Option<NodeID> {
capturable.id()
}
/// Returns the relative location of nodes in the source code (if they are in same file)
pub fn get_relative_location_of_nodes(
&self,
first: NodeID,
second: NodeID,
) -> Option<Ordering> {
let f = self.get_node_sort_key_pure(self.nodes.get(&first)?);
let s = self.get_node_sort_key_pure(self.nodes.get(&second)?);
// If the nodes aren't in the same file location comparison doesn't make sense
if f.0 != s.0 {
return None;
}
match f.1.cmp(&s.1) {
Ordering::Less => Some(Ordering::Less),
Ordering::Equal => {
// If the nodes are on the same line, we must compare offset in the chopped_location
let first_character_offset = f.2.split_once(':').unwrap();
let second_character_offset = s.2.split_once(':').unwrap();
Some(first_character_offset.0.cmp(second_character_offset.0))
}
Ordering::Greater => Some(Ordering::Greater),
}
}
pub fn get_node_sort_key_pure(&self, node: &ASTNode) -> (String, usize, String) {
let source_unit = self.get_source_unit_from_child_node(node).unwrap();
let absolute_path = source_unit.absolute_path.as_ref().unwrap().clone();
let source_line = node
.src()
.map(|src| source_unit.source_line(src).unwrap_or(0)) // If `src` is `Some`, get the line number, else return 0
.unwrap_or(0); // If `src` is `None`, default to 0
let src_location = node.src().unwrap_or("");
let chopped_location = match src_location.rfind(':') {
Some(index) => &src_location[..index],
None => src_location, // No colon found, return the original string
}
.to_string();
(absolute_path, source_line, chopped_location)
}
pub fn get_node_sort_key(&self, node: &ASTNode) -> (String, usize, String) {
let source_unit = self.get_source_unit_from_child_node(node).unwrap();
let absolute_path = source_unit.absolute_path.as_ref().unwrap().clone();
let source_line =
node.src().map(|src| source_unit.source_line(src).unwrap_or(0)).unwrap_or(0);
let src_location = match node {
ASTNode::ContractDefinition(contract_node) => contract_node
.name_location
.as_ref()
.filter(|loc| !loc.contains("-1"))
.map_or_else(|| contract_node.src.clone(), |loc| loc.clone()),
ASTNode::FunctionDefinition(function_node) => function_node
.name_location
.as_ref()
.filter(|loc| !loc.contains("-1"))
.map_or_else(|| function_node.src.clone(), |loc| loc.clone()),
ASTNode::ModifierDefinition(modifier_node) => modifier_node
.name_location
.as_ref()
.filter(|loc| !loc.contains("-1"))
.map_or_else(|| modifier_node.src.clone(), |loc| loc.clone()),
ASTNode::VariableDeclaration(variable_node) => variable_node
.name_location
.as_ref()
.filter(|loc| !loc.contains("-1"))
.map_or_else(|| variable_node.src.clone(), |loc| loc.clone()),
_ => node.src().unwrap_or("").to_string(),
};
let chopped_location = src_location
.rfind(':')
.map(|index| src_location[..index].to_string())
.unwrap_or(src_location);
(absolute_path, source_line, chopped_location)
}
pub fn get_code_snippet(&self, node: &ASTNode) -> String {
let (filepath, _, src_location) = self.get_node_sort_key_pure(node);
let source_unit = self
.source_units()
.into_iter()
.find(|s| s.absolute_path.as_ref().is_some_and(|p| *p == filepath))
.expect("node not found");
let source_content = source_unit.source.as_ref().expect("source not found");
let (byte_offset_str, byte_len_str) = src_location.split_once(':').unwrap();
let byte_offset: usize = byte_offset_str.parse().unwrap();
let byte_length: usize = byte_len_str.parse().unwrap();
let code_snippet = &source_content[byte_offset..byte_offset + byte_length];
code_snippet.to_owned()
}
}
impl WorkspaceContext {
pub fn array_type_names(&self) -> Vec<&ArrayTypeName> {
self.array_type_names_context.keys().collect()
}
pub fn assignments(&self) -> Vec<&Assignment> {
self.assignments_context.keys().collect()
}
pub fn binary_operations(&self) -> Vec<&BinaryOperation> {
self.binary_operations_context.keys().collect()
}
pub fn blocks(&self) -> Vec<&Block> {
self.blocks_context.keys().collect()
}
pub fn conditionals(&self) -> Vec<&Conditional> {
self.conditionals_context.keys().collect()
}
pub fn contract_definitions(&self) -> Vec<&ContractDefinition> {
self.contract_definitions_context.keys().collect()
}
pub fn elementary_type_names(&self) -> Vec<&ElementaryTypeName> {
self.elementary_type_names_context.keys().collect()
}
pub fn elementary_type_name_expressions(&self) -> Vec<&ElementaryTypeNameExpression> {
self.elementary_type_name_expressions_context.keys().collect()
}
pub fn emit_statements(&self) -> Vec<&EmitStatement> {
self.emit_statements_context.keys().collect()
}
pub fn enum_definitions(&self) -> Vec<&EnumDefinition> {
self.enum_definitions_context.keys().collect()
}
pub fn enum_values(&self) -> Vec<&EnumValue> {
self.enum_values_context.keys().collect()
}
pub fn event_definitions(&self) -> Vec<&EventDefinition> {
self.event_definitions_context.keys().collect()
}
pub fn error_definitions(&self) -> Vec<&ErrorDefinition> {
self.error_definitions_context.keys().collect()
}
pub fn expression_statements(&self) -> Vec<&ExpressionStatement> {
self.expression_statements_context.keys().collect()
}
pub fn function_calls(&self) -> Vec<&FunctionCall> {
self.function_calls_context.keys().collect()
}
pub fn function_call_options(&self) -> Vec<&FunctionCallOptions> {
self.function_call_options_context.keys().collect()
}
pub fn function_definitions(&self) -> Vec<&FunctionDefinition> {
self.function_definitions_context.keys().collect()
}
pub fn function_type_names(&self) -> Vec<&FunctionTypeName> {
self.function_type_names_context.keys().collect()
}
pub fn for_statements(&self) -> Vec<&ForStatement> {
self.for_statements_context.keys().collect()
}
pub fn identifiers(&self) -> Vec<&Identifier> {
self.identifiers_context.keys().collect()
}
pub fn identifier_paths(&self) -> Vec<&IdentifierPath> {
self.identifier_paths_context.keys().collect()
}
pub fn if_statements(&self) -> Vec<&IfStatement> {
self.if_statements_context.keys().collect()
}
pub fn import_directives(&self) -> Vec<&ImportDirective> {
self.import_directives_context.keys().collect()
}
pub fn index_accesses(&self) -> Vec<&IndexAccess> {
self.index_accesses_context.keys().collect()
}
pub fn index_range_accesses(&self) -> Vec<&IndexRangeAccess> {
self.index_range_accesses_context.keys().collect()
}
pub fn inheritance_specifiers(&self) -> Vec<&InheritanceSpecifier> {
self.inheritance_specifiers_context.keys().collect()
}
pub fn inline_assemblies(&self) -> Vec<&InlineAssembly> {
self.inline_assemblies_context.keys().collect()
}
pub fn literals(&self) -> Vec<&Literal> {
self.literals_context.keys().collect()
}
pub fn member_accesses(&self) -> Vec<&MemberAccess> {
self.member_accesses_context.keys().collect()
}
pub fn new_expressions(&self) -> Vec<&NewExpression> {
self.new_expressions_context.keys().collect()
}
pub fn mappings(&self) -> Vec<&Mapping> {
self.mappings_context.keys().collect()
}
pub fn modifier_definitions(&self) -> Vec<&ModifierDefinition> {
self.modifier_definitions_context.keys().collect()
}
pub fn modifier_invocations(&self) -> Vec<&ModifierInvocation> {
self.modifier_invocations_context.keys().collect()
}
pub fn override_specifiers(&self) -> Vec<&OverrideSpecifier> {
self.override_specifiers_context.keys().collect()
}
pub fn parameter_lists(&self) -> Vec<&ParameterList> {
self.parameter_lists_context.keys().collect()
}
pub fn pragma_directives(&self) -> Vec<&PragmaDirective> {
self.pragma_directives_context.keys().collect()
}
pub fn returns(&self) -> Vec<&Return> {
self.returns_context.keys().collect()
}
pub fn revert_statements(&self) -> Vec<&RevertStatement> {
self.revert_statements_context.keys().collect()
}
pub fn source_units(&self) -> Vec<&SourceUnit> {
self.source_units_context.iter().collect()
}
pub fn struct_definitions(&self) -> Vec<&StructDefinition> {
self.struct_definitions_context.keys().collect()
}
pub fn structured_documentations(&self) -> Vec<&StructuredDocumentation> {
self.structured_documentations_context.keys().collect()
}
pub fn try_statements(&self) -> Vec<&TryStatement> {
self.try_statements_context.keys().collect()
}
pub fn try_catch_clauses(&self) -> Vec<&TryCatchClause> {
self.try_catch_clauses_context.keys().collect()
}
pub fn tuple_expressions(&self) -> Vec<&TupleExpression> {
self.tuple_expressions_context.keys().collect()
}
pub fn unary_operations(&self) -> Vec<&UnaryOperation> {
self.unary_operations_context.keys().collect()
}
pub fn unchecked_blocks(&self) -> Vec<&UncheckedBlock> {
self.unchecked_blocks_context.keys().collect()
}
pub fn user_defined_type_names(&self) -> Vec<&UserDefinedTypeName> {
self.user_defined_type_names_context.keys().collect()
}
pub fn user_defined_value_type_definitions(&self) -> Vec<&UserDefinedValueTypeDefinition> {
self.user_defined_value_type_definitions_context.keys().collect()
}
pub fn using_for_directives(&self) -> Vec<&UsingForDirective> {
self.using_for_directives_context.keys().collect()
}
pub fn variable_declarations(&self) -> Vec<&VariableDeclaration> {
self.variable_declarations_context.keys().collect()
}
pub fn variable_declaration_statements(&self) -> Vec<&VariableDeclarationStatement> {
self.variable_declaration_statements_context.keys().collect()
}
pub fn while_statements(&self) -> Vec<&WhileStatement> {
self.while_statements_context.keys().collect()
}
pub fn do_while_statements(&self) -> Vec<&DoWhileStatement> {
self.do_while_statements_context.keys().collect()
}
pub fn break_statements(&self) -> Vec<&Break> {
self.break_statements_context.keys().collect()
}
pub fn continue_statements(&self) -> Vec<&Continue> {
self.continue_statements_context.keys().collect()
}
pub fn placeholder_statements(&self) -> Vec<&PlaceholderStatement> {
self.placeholder_statements_context.keys().collect()
}
pub fn yul_function_calls(&self) -> Vec<&YulFunctionCall> {
self.yul_function_calls_context.keys().collect()
}
pub fn yul_identifiers(&self) -> Vec<&YulIdentifier> {
self.yul_identifiers_context.keys().collect()
}
pub fn yul_assignments(&self) -> Vec<&YulAssignment> {
self.yul_assignments_context.keys().collect()
}
pub fn yul_literals(&self) -> Vec<&YulLiteral> {
self.yul_literals_context.keys().collect()
}
}
generate_get_source_unit! {
ArrayTypeName => array_type_names_context,
Assignment => assignments_context,
BinaryOperation => binary_operations_context,
Block => blocks_context,
Conditional => conditionals_context,
ContractDefinition => contract_definitions_context,
ElementaryTypeName => elementary_type_names_context,
ElementaryTypeNameExpression => elementary_type_name_expressions_context,
EmitStatement => emit_statements_context,
EnumDefinition => enum_definitions_context,
EnumValue => enum_values_context,
EventDefinition => event_definitions_context,
ErrorDefinition => error_definitions_context,
ExpressionStatement => expression_statements_context,
FunctionCall => function_calls_context,
FunctionCallOptions => function_call_options_context,
FunctionDefinition => function_definitions_context,
FunctionTypeName => function_type_names_context,
ForStatement => for_statements_context,
Identifier => identifiers_context,
IdentifierPath => identifier_paths_context,
IfStatement => if_statements_context,
ImportDirective => import_directives_context,
IndexAccess => index_accesses_context,
IndexRangeAccess => index_range_accesses_context,
InheritanceSpecifier => inheritance_specifiers_context,
InlineAssembly => inline_assemblies_context,
Literal => literals_context,
MemberAccess => member_accesses_context,
NewExpression => new_expressions_context,
Mapping => mappings_context,
ModifierDefinition => modifier_definitions_context,
ModifierInvocation => modifier_invocations_context,
OverrideSpecifier => override_specifiers_context,
ParameterList => parameter_lists_context,
PragmaDirective => pragma_directives_context,
Return => returns_context,
RevertStatement => revert_statements_context,
StructDefinition => struct_definitions_context,
StructuredDocumentation => structured_documentations_context,
TryStatement => try_statements_context,
TryCatchClause => try_catch_clauses_context,
TupleExpression => tuple_expressions_context,
UnaryOperation => unary_operations_context,
UncheckedBlock => unchecked_blocks_context,
UserDefinedTypeName => user_defined_type_names_context,
UserDefinedValueTypeDefinition => user_defined_value_type_definitions_context,
UsingForDirective => using_for_directives_context,
VariableDeclaration => variable_declarations_context,
VariableDeclarationStatement => variable_declaration_statements_context,
WhileStatement => while_statements_context,
DoWhileStatement => do_while_statements_context,
Break => break_statements_context,
Continue => continue_statements_context,
PlaceholderStatement => placeholder_statements_context,
YulFunctionCall => yul_function_calls_context,
YulIdentifier => yul_identifiers_context,
YulLiteral => yul_literals_context,
}
```
--------------------------------------------------------------------------------
/benchmarks/aderyn/report/relative_iteration_times_small.svg:
--------------------------------------------------------------------------------
```
<svg width="450" height="300" viewBox="0 0 450 300" xmlns="http://www.w3.org/2000/svg">
<text x="15" y="130" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 15, 130)">
Average Iteration Time (ms)
</text>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="244" x2="75" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="110" y1="244" x2="110" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="146" y1="244" x2="146" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="182" y1="244" x2="182" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="218" y1="244" x2="218" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="254" y1="244" x2="254" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="290" y1="244" x2="290" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="326" y1="244" x2="326" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="362" y1="244" x2="362" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="398" y1="244" x2="398" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="434" y1="244" x2="434" y2="15"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="228" x2="434" y2="228"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="198" x2="434" y2="198"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="168" x2="434" y2="168"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="138" x2="434" y2="138"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="108" x2="434" y2="108"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="77" x2="434" y2="77"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="47" x2="434" y2="47"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="17" x2="434" y2="17"/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="74,15 74,244 "/>
<text x="65" y="228" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
100.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,228 74,228 "/>
<text x="65" y="198" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
120.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,198 74,198 "/>
<text x="65" y="168" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
140.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,168 74,168 "/>
<text x="65" y="138" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
160.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,138 74,138 "/>
<text x="65" y="108" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
180.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,108 74,108 "/>
<text x="65" y="77" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
200.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,77 74,77 "/>
<text x="65" y="47" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
220.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,47 74,47 "/>
<text x="65" y="17" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
240.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,17 74,17 "/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="75,245 434,245 "/>
<text x="75" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="75,245 75,250 "/>
<text x="110" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
10
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="110,245 110,250 "/>
<text x="146" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
20
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="146,245 146,250 "/>
<text x="182" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
30
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="182,245 182,250 "/>
<text x="218" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
40
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="218,245 218,250 "/>
<text x="254" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="254,245 254,250 "/>
<text x="290" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
60
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="290,245 290,250 "/>
<text x="326" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="326,245 326,250 "/>
<text x="362" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
80
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="362,245 362,250 "/>
<text x="398" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
90
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="398,245 398,250 "/>
<text x="434" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
100
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="434,245 434,250 "/>
<circle cx="78" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="82" cy="189" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="85" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="89" cy="225" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="92" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="96" cy="237" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="100" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="103" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="107" cy="163" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="110" cy="201" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="114" cy="203" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="118" cy="198" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="121" cy="199" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="125" cy="224" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="128" cy="211" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="132" cy="227" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="136" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="139" cy="227" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="143" cy="223" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="146" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="150" cy="225" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="153" cy="230" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="157" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="161" cy="223" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="164" cy="91" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="168" cy="78" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="171" cy="164" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="175" cy="228" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="179" cy="241" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="182" cy="239" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="186" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="189" cy="239" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="193" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="197" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="200" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="204" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="207" cy="235" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="211" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="215" cy="244" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="218" cy="239" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="222" cy="241" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="225" cy="241" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="229" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="232" cy="223" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="236" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="240" cy="215" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="243" cy="235" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="247" cy="241" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="250" cy="232" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="254" cy="180" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="258" cy="190" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="261" cy="229" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="265" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="268" cy="239" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="272" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="276" cy="227" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="279" cy="219" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="283" cy="206" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="286" cy="210" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="290" cy="203" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="293" cy="226" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="297" cy="228" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="301" cy="229" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="304" cy="223" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="308" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="311" cy="220" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="315" cy="203" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="319" cy="206" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="322" cy="199" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="326" cy="206" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="329" cy="224" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="333" cy="199" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="337" cy="154" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="340" cy="168" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="344" cy="195" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="347" cy="197" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="351" cy="15" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="355" cy="144" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="358" cy="138" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="362" cy="172" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="365" cy="171" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="369" cy="169" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="372" cy="158" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="376" cy="188" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="380" cy="214" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="383" cy="205" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="387" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="390" cy="205" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="394" cy="188" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="398" cy="139" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="401" cy="192" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="405" cy="201" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="408" cy="204" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="412" cy="198" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="416" cy="204" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="419" cy="133" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="423" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="426" cy="120" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="430" cy="212" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="434" cy="196" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="78" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="82" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="85" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="89" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="92" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="96" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="100" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="103" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="107" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="110" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="114" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="118" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="121" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="125" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="128" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="132" cy="238" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="136" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="139" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="143" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="146" cy="238" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="150" cy="236" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="153" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="157" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="161" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="164" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="168" cy="189" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="171" cy="224" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="175" cy="237" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="179" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="182" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="186" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="189" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="193" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="197" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="200" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="204" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="207" cy="236" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="211" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="215" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="218" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="222" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="225" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="229" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="232" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="236" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="240" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="243" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="247" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="250" cy="226" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="254" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="258" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="261" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="265" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="268" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="272" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="276" cy="238" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="279" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="283" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="286" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="290" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="293" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="297" cy="243" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="301" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="304" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="308" cy="244" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="311" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="315" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="319" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="322" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="326" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="329" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="333" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="337" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="340" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="344" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="347" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="351" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="355" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="358" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="362" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="365" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="369" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="372" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="376" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="380" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="383" cy="179" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="387" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="390" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="394" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="398" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="401" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="405" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="408" cy="239" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="412" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="416" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="419" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="423" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="426" cy="241" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="430" cy="242" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="434" cy="240" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
</svg>
```
--------------------------------------------------------------------------------
/benchmarks/aderyn/report/both/iteration_times.svg:
--------------------------------------------------------------------------------
```
<svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
<text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
aderyn
</text>
<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)">
Average Iteration Time (ms)
</text>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="472" x2="87" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="171" y1="472" x2="171" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="256" y1="472" x2="256" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="340" y1="472" x2="340" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="425" y1="472" x2="425" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="509" y1="472" x2="509" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="594" y1="472" x2="594" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="678" y1="472" x2="678" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="763" y1="472" x2="763" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="847" y1="472" x2="847" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="932" y1="472" x2="932" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="443" x2="932" y2="443"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="388" x2="932" y2="388"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="333" x2="932" y2="333"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="277" x2="932" y2="277"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="222" x2="932" y2="222"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="167" x2="932" y2="167"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="112" x2="932" y2="112"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="56" x2="932" y2="56"/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
<text x="77" y="443" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
100.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,443 86,443 "/>
<text x="77" y="388" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
120.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,388 86,388 "/>
<text x="77" y="333" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
140.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,333 86,333 "/>
<text x="77" y="277" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
160.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,277 86,277 "/>
<text x="77" y="222" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
180.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,222 86,222 "/>
<text x="77" y="167" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
200.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,167 86,167 "/>
<text x="77" y="112" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
220.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,112 86,112 "/>
<text x="77" y="56" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
240.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,56 86,56 "/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
<text x="87" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 87,478 "/>
<text x="171" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
10
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="171,473 171,478 "/>
<text x="256" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
20
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="256,473 256,478 "/>
<text x="340" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
30
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="340,473 340,478 "/>
<text x="425" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
40
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="425,473 425,478 "/>
<text x="509" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="509,473 509,478 "/>
<text x="594" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
60
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="594,473 594,478 "/>
<text x="678" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="678,473 678,478 "/>
<text x="763" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
80
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="763,473 763,478 "/>
<text x="847" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
90
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="847,473 847,478 "/>
<text x="932" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
100
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="932,473 932,478 "/>
<circle cx="95" cy="460" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="103" cy="372" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="112" cy="453" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="120" cy="437" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="129" cy="453" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="137" cy="460" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="146" cy="464" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="154" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="163" cy="323" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="171" cy="394" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="179" cy="397" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="188" cy="387" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="196" cy="390" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="205" cy="435" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="213" cy="411" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="222" cy="441" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="230" cy="454" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="239" cy="441" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="247" cy="433" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="256" cy="453" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="264" cy="437" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="272" cy="445" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="281" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="289" cy="434" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="298" cy="192" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="306" cy="169" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="315" cy="325" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="323" cy="442" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="332" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="340" cy="462" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="348" cy="464" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="357" cy="462" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="365" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="374" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="382" cy="460" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="391" cy="458" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="399" cy="454" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="408" cy="461" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="416" cy="472" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="425" cy="462" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="433" cy="466" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="441" cy="466" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="450" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="458" cy="434" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="467" cy="405" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="475" cy="418" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="484" cy="456" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="492" cy="466" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="501" cy="450" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="509" cy="354" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="517" cy="374" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="526" cy="445" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="534" cy="461" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="543" cy="462" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="551" cy="458" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="560" cy="441" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="568" cy="427" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="577" cy="402" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="585" cy="409" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="594" cy="397" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="602" cy="439" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="610" cy="443" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="619" cy="444" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="627" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="636" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="644" cy="428" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="653" cy="396" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="661" cy="402" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="670" cy="390" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="678" cy="402" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="686" cy="435" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="695" cy="390" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="703" cy="306" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="712" cy="333" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="720" cy="382" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="729" cy="386" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="737" cy="53" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="746" cy="288" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="754" cy="277" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="763" cy="340" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="771" cy="338" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="779" cy="334" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="788" cy="315" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="796" cy="368" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="805" cy="416" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="813" cy="400" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="822" cy="404" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="830" cy="401" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="839" cy="370" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="847" cy="279" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="855" cy="377" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="864" cy="394" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="872" cy="398" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="881" cy="387" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="889" cy="399" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="898" cy="268" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="906" cy="404" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="915" cy="244" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="923" cy="412" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="932" cy="384" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="95" cy="469" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="103" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="112" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="120" cy="463" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="129" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="137" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="146" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="154" cy="463" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="163" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="171" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="179" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="188" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="196" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="205" cy="471" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="213" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="222" cy="461" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="230" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="239" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="247" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="256" cy="461" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="264" cy="457" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="272" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="281" cy="471" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="289" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="298" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="306" cy="370" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="315" cy="435" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="323" cy="458" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="332" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="340" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="348" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="357" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="365" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="374" cy="471" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="382" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="391" cy="472" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="399" cy="457" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="408" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="416" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="425" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="433" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="441" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="450" cy="463" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="458" cy="469" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="467" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="475" cy="472" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="484" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="492" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="501" cy="439" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="509" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="517" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="526" cy="471" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="534" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="543" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="551" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="560" cy="461" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="568" cy="469" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="577" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="585" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="594" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="602" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="610" cy="470" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="619" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="627" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="636" cy="471" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="644" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="653" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="661" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="670" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="678" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="686" cy="463" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="695" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="703" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="712" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="720" cy="463" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="729" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="737" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="746" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="754" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="763" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="771" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="779" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="788" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="796" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="805" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="813" cy="353" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="822" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="830" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="839" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="847" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="855" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="864" cy="468" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="872" cy="462" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="881" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="889" cy="465" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="898" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="906" cy="464" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="915" cy="466" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="923" cy="467" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<circle cx="932" cy="463" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
<text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Current
</text>
<text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Base
</text>
<circle cx="112" cy="73" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="112" cy="88" r="3" opacity="1" fill="#E31A1C" stroke="none" stroke-width="1"/>
</svg>
```