dev c9ab2b6827fc cached
2844 files
47.0 MB
4.1M tokens
13637 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,284K chars total). Download the full file to get everything.
Repository: flipperdevices/flipperzero-firmware
Branch: dev
Commit: c9ab2b6827fc
Files: 2844
Total size: 47.0 MB

Directory structure:
gitextract_izuyb6zx/

├── .clang-format
├── .clangd
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01_bug_report.yml
│   │   ├── 02_enhancements.yml
│   │   ├── 03_feature_request.yml
│   │   └── config.yml
│   ├── actions/
│   │   └── submit_sdk/
│   │       └── action.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── build.yml
│       ├── build_compact.yml
│       ├── docs.yml
│       ├── lint_and_submodule_check.yml
│       ├── merge_report.yml
│       ├── pvs_studio.yml
│       ├── reindex.yml
│       ├── unit_tests.yml
│       └── updater_test.yml
├── .gitignore
├── .gitmodules
├── .pvsconfig
├── .pvsoptions
├── .sublime-project
├── .vscode/
│   └── ReadMe.md
├── CODE_OF_CONDUCT.md
├── CODING_STYLE.md
├── CONTRIBUTING.md
├── LICENSE
├── ReadMe.md
├── SConstruct
├── applications/
│   ├── ReadMe.md
│   ├── debug/
│   │   ├── accessor/
│   │   │   ├── accessor.cpp
│   │   │   ├── accessor_app.cpp
│   │   │   ├── accessor_app.h
│   │   │   ├── accessor_event.h
│   │   │   ├── accessor_view_manager.cpp
│   │   │   ├── accessor_view_manager.h
│   │   │   ├── application.fam
│   │   │   ├── callback_connector.h
│   │   │   ├── helpers/
│   │   │   │   ├── wiegand.cpp
│   │   │   │   └── wiegand.h
│   │   │   └── scene/
│   │   │       ├── accessor_scene_generic.h
│   │   │       ├── accessor_scene_start.cpp
│   │   │       └── accessor_scene_start.h
│   │   ├── application.fam
│   │   ├── battery_test_app/
│   │   │   ├── application.fam
│   │   │   ├── battery_test_app.c
│   │   │   ├── battery_test_app.h
│   │   │   └── views/
│   │   │       ├── battery_info.c
│   │   │       └── battery_info.h
│   │   ├── blink_test/
│   │   │   ├── application.fam
│   │   │   └── blink_test.c
│   │   ├── bt_debug_app/
│   │   │   ├── application.fam
│   │   │   ├── bt_debug_app.c
│   │   │   ├── bt_debug_app.h
│   │   │   └── views/
│   │   │       ├── bt_carrier_test.c
│   │   │       ├── bt_carrier_test.h
│   │   │       ├── bt_packet_test.c
│   │   │       ├── bt_packet_test.h
│   │   │       ├── bt_test.c
│   │   │       ├── bt_test.h
│   │   │       └── bt_test_types.h
│   │   ├── ccid_test/
│   │   │   ├── application.fam
│   │   │   ├── ccid_test_app.c
│   │   │   ├── ccid_test_app_commands.c
│   │   │   ├── ccid_test_app_commands.h
│   │   │   ├── client/
│   │   │   │   ├── ccid_client.py
│   │   │   │   └── requirements.txt
│   │   │   └── iso7816/
│   │   │       ├── iso7816_atr.h
│   │   │       ├── iso7816_handler.c
│   │   │       ├── iso7816_handler.h
│   │   │       ├── iso7816_response.c
│   │   │       ├── iso7816_response.h
│   │   │       ├── iso7816_t0_apdu.c
│   │   │       └── iso7816_t0_apdu.h
│   │   ├── crash_test/
│   │   │   ├── application.fam
│   │   │   └── crash_test.c
│   │   ├── direct_draw/
│   │   │   ├── application.fam
│   │   │   └── direct_draw.c
│   │   ├── display_test/
│   │   │   ├── application.fam
│   │   │   ├── display_test.c
│   │   │   ├── view_display_test.c
│   │   │   └── view_display_test.h
│   │   ├── event_loop_blink_test/
│   │   │   ├── application.fam
│   │   │   └── event_loop_blink_test.c
│   │   ├── expansion_test/
│   │   │   ├── application.fam
│   │   │   ├── assets/
│   │   │   │   └── test.txt
│   │   │   └── expansion_test.c
│   │   ├── file_browser_test/
│   │   │   ├── application.fam
│   │   │   ├── file_browser_app.c
│   │   │   ├── file_browser_app_i.h
│   │   │   └── scenes/
│   │   │       ├── file_browser_scene.c
│   │   │       ├── file_browser_scene.h
│   │   │       ├── file_browser_scene_browser.c
│   │   │       ├── file_browser_scene_config.h
│   │   │       ├── file_browser_scene_result.c
│   │   │       └── file_browser_scene_start.c
│   │   ├── infrared_test/
│   │   │   ├── application.fam
│   │   │   └── infrared_test.c
│   │   ├── keypad_test/
│   │   │   ├── application.fam
│   │   │   └── keypad_test.c
│   │   ├── lfrfid_debug/
│   │   │   ├── application.fam
│   │   │   ├── lfrfid_debug.c
│   │   │   ├── lfrfid_debug_i.h
│   │   │   ├── scenes/
│   │   │   │   ├── lfrfid_debug_app_scene_start.c
│   │   │   │   ├── lfrfid_debug_app_scene_tune.c
│   │   │   │   ├── lfrfid_debug_scene.c
│   │   │   │   ├── lfrfid_debug_scene.h
│   │   │   │   └── lfrfid_debug_scene_config.h
│   │   │   └── views/
│   │   │       ├── lfrfid_debug_view_tune.c
│   │   │       └── lfrfid_debug_view_tune.h
│   │   ├── loader_chaining_a/
│   │   │   ├── application.fam
│   │   │   └── loader_chaining_a.c
│   │   ├── loader_chaining_b/
│   │   │   ├── application.fam
│   │   │   └── loader_chaining_b.c
│   │   ├── locale_test/
│   │   │   ├── application.fam
│   │   │   └── locale_test.c
│   │   ├── rpc_debug_app/
│   │   │   ├── application.fam
│   │   │   ├── rpc_debug_app.c
│   │   │   ├── rpc_debug_app.h
│   │   │   └── scenes/
│   │   │       ├── rpc_debug_app_scene.c
│   │   │       ├── rpc_debug_app_scene.h
│   │   │       ├── rpc_debug_app_scene_config.h
│   │   │       ├── rpc_debug_app_scene_input_data_exchange.c
│   │   │       ├── rpc_debug_app_scene_input_error_code.c
│   │   │       ├── rpc_debug_app_scene_input_error_text.c
│   │   │       ├── rpc_debug_app_scene_receive_data_exchange.c
│   │   │       ├── rpc_debug_app_scene_start.c
│   │   │       ├── rpc_debug_app_scene_start_dummy.c
│   │   │       ├── rpc_debug_app_scene_test_app_error.c
│   │   │       └── rpc_debug_app_scene_test_data_exchange.c
│   │   ├── speaker_debug/
│   │   │   ├── application.fam
│   │   │   └── speaker_debug.c
│   │   ├── subghz_test/
│   │   │   ├── application.fam
│   │   │   ├── helpers/
│   │   │   │   ├── subghz_test_event.h
│   │   │   │   ├── subghz_test_frequency.c
│   │   │   │   ├── subghz_test_frequency.h
│   │   │   │   └── subghz_test_types.h
│   │   │   ├── protocol/
│   │   │   │   ├── math.c
│   │   │   │   ├── math.h
│   │   │   │   ├── princeton_for_testing.c
│   │   │   │   └── princeton_for_testing.h
│   │   │   ├── scenes/
│   │   │   │   ├── subghz_test_scene.c
│   │   │   │   ├── subghz_test_scene.h
│   │   │   │   ├── subghz_test_scene_about.c
│   │   │   │   ├── subghz_test_scene_carrier.c
│   │   │   │   ├── subghz_test_scene_config.h
│   │   │   │   ├── subghz_test_scene_packet.c
│   │   │   │   ├── subghz_test_scene_show_only_rx.c
│   │   │   │   ├── subghz_test_scene_start.c
│   │   │   │   └── subghz_test_scene_static.c
│   │   │   ├── subghz_test_app.c
│   │   │   ├── subghz_test_app_i.c
│   │   │   ├── subghz_test_app_i.h
│   │   │   └── views/
│   │   │       ├── subghz_test_carrier.c
│   │   │       ├── subghz_test_carrier.h
│   │   │       ├── subghz_test_packet.c
│   │   │       ├── subghz_test_packet.h
│   │   │       ├── subghz_test_static.c
│   │   │       └── subghz_test_static.h
│   │   ├── text_box_element_test/
│   │   │   ├── application.fam
│   │   │   └── text_box_element_test.c
│   │   ├── text_box_view_test/
│   │   │   ├── application.fam
│   │   │   └── text_box_view_test.c
│   │   ├── uart_echo/
│   │   │   ├── application.fam
│   │   │   └── uart_echo.c
│   │   ├── unit_tests/
│   │   │   ├── application.fam
│   │   │   ├── resources/
│   │   │   │   └── unit_tests/
│   │   │   │       ├── Manifest_test
│   │   │   │       ├── compress/
│   │   │   │       │   └── test.ths
│   │   │   │       ├── infrared/
│   │   │   │       │   ├── test_kaseikyo.irtest
│   │   │   │       │   ├── test_nec.irtest
│   │   │   │       │   ├── test_nec42.irtest
│   │   │   │       │   ├── test_nec42ext.irtest
│   │   │   │       │   ├── test_necext.irtest
│   │   │   │       │   ├── test_pioneer.irtest
│   │   │   │       │   ├── test_rc5.irtest
│   │   │   │       │   ├── test_rc5x.irtest
│   │   │   │       │   ├── test_rc6.irtest
│   │   │   │       │   ├── test_rca.irtest
│   │   │   │       │   ├── test_samsung32.irtest
│   │   │   │       │   └── test_sirc.irtest
│   │   │   │       ├── js/
│   │   │   │       │   ├── basic.js
│   │   │   │       │   ├── event_loop.js
│   │   │   │       │   ├── math.js
│   │   │   │       │   └── storage.js
│   │   │   │       ├── nfc/
│   │   │   │       │   ├── Felica.nfc
│   │   │   │       │   ├── Ntag213_locked.nfc
│   │   │   │       │   ├── Ntag215.nfc
│   │   │   │       │   ├── Ntag216.nfc
│   │   │   │       │   ├── Slix_cap_accept_all_pass.nfc
│   │   │   │       │   ├── Slix_cap_default.nfc
│   │   │   │       │   ├── Slix_cap_missed.nfc
│   │   │   │       │   ├── Ultralight_11.nfc
│   │   │   │       │   ├── Ultralight_21.nfc
│   │   │   │       │   ├── Ultralight_C.nfc
│   │   │   │       │   ├── nfc_nfca_signal_long.nfc
│   │   │   │       │   └── nfc_nfca_signal_short.nfc
│   │   │   │       ├── storage/
│   │   │   │       │   └── md5.txt
│   │   │   │       └── subghz/
│   │   │   │           ├── alutech_at_4n_raw.sub
│   │   │   │           ├── ansonic.sub
│   │   │   │           ├── ansonic_raw.sub
│   │   │   │           ├── bett.sub
│   │   │   │           ├── bett_raw.sub
│   │   │   │           ├── came.sub
│   │   │   │           ├── came_atomo_raw.sub
│   │   │   │           ├── came_raw.sub
│   │   │   │           ├── came_twee.sub
│   │   │   │           ├── came_twee_raw.sub
│   │   │   │           ├── cenmax_raw.sub
│   │   │   │           ├── clemsa.sub
│   │   │   │           ├── clemsa_raw.sub
│   │   │   │           ├── dickert_mahs.sub
│   │   │   │           ├── dickert_raw.sub
│   │   │   │           ├── doitrand.sub
│   │   │   │           ├── doitrand_raw.sub
│   │   │   │           ├── doorhan.sub
│   │   │   │           ├── doorhan_raw.sub
│   │   │   │           ├── dooya.sub
│   │   │   │           ├── dooya_raw.sub
│   │   │   │           ├── faac_slh_raw.sub
│   │   │   │           ├── feron.sub
│   │   │   │           ├── feron_raw.sub
│   │   │   │           ├── gangqi.sub
│   │   │   │           ├── gangqi_raw.sub
│   │   │   │           ├── gate_tx.sub
│   │   │   │           ├── gate_tx_raw.sub
│   │   │   │           ├── hay21_raw.sub
│   │   │   │           ├── hollarm.sub
│   │   │   │           ├── hollarm_raw.sub
│   │   │   │           ├── holtek.sub
│   │   │   │           ├── holtek_ht12x.sub
│   │   │   │           ├── holtek_ht12x_raw.sub
│   │   │   │           ├── holtek_raw.sub
│   │   │   │           ├── honeywell_wdb.sub
│   │   │   │           ├── honeywell_wdb_raw.sub
│   │   │   │           ├── hormann_hsm_raw.sub
│   │   │   │           ├── ido_117_111_raw.sub
│   │   │   │           ├── intertechno_v3.sub
│   │   │   │           ├── intertechno_v3_raw.sub
│   │   │   │           ├── kia_seed_raw.sub
│   │   │   │           ├── kinggates_stylo4k_raw.sub
│   │   │   │           ├── legrand.sub
│   │   │   │           ├── legrand_raw.sub
│   │   │   │           ├── linear.sub
│   │   │   │           ├── linear_delta3.sub
│   │   │   │           ├── linear_delta3_raw.sub
│   │   │   │           ├── linear_raw.sub
│   │   │   │           ├── magellan.sub
│   │   │   │           ├── magellan_raw.sub
│   │   │   │           ├── marantec.sub
│   │   │   │           ├── marantec24.sub
│   │   │   │           ├── marantec24_raw.sub
│   │   │   │           ├── marantec_raw.sub
│   │   │   │           ├── mastercode.sub
│   │   │   │           ├── mastercode_raw.sub
│   │   │   │           ├── megacode.sub
│   │   │   │           ├── megacode_raw.sub
│   │   │   │           ├── nero_radio_raw.sub
│   │   │   │           ├── nero_sketch_raw.sub
│   │   │   │           ├── nice_flo.sub
│   │   │   │           ├── nice_flo_raw.sub
│   │   │   │           ├── nice_flor_s_raw.sub
│   │   │   │           ├── nice_one_raw.sub
│   │   │   │           ├── phoenix_v2.sub
│   │   │   │           ├── phoenix_v2_raw.sub
│   │   │   │           ├── power_smart.sub
│   │   │   │           ├── power_smart_raw.sub
│   │   │   │           ├── princeton.sub
│   │   │   │           ├── princeton_raw.sub
│   │   │   │           ├── revers_rb2.sub
│   │   │   │           ├── revers_rb2_raw.sub
│   │   │   │           ├── roger.sub
│   │   │   │           ├── roger_raw.sub
│   │   │   │           ├── scher_khan_magic_code.sub
│   │   │   │           ├── security_pls_1_0.sub
│   │   │   │           ├── security_pls_1_0_raw.sub
│   │   │   │           ├── security_pls_2_0.sub
│   │   │   │           ├── security_pls_2_0_raw.sub
│   │   │   │           ├── smc5326.sub
│   │   │   │           ├── smc5326_raw.sub
│   │   │   │           ├── somfy_keytis_raw.sub
│   │   │   │           ├── somfy_telis_raw.sub
│   │   │   │           └── test_random_raw.sub
│   │   │   ├── test_runner.c
│   │   │   ├── test_runner.h
│   │   │   ├── tests/
│   │   │   │   ├── args/
│   │   │   │   │   └── args_test.c
│   │   │   │   ├── bit_lib/
│   │   │   │   │   └── bit_lib_test.c
│   │   │   │   ├── bt/
│   │   │   │   │   └── bt_test.c
│   │   │   │   ├── common/
│   │   │   │   │   └── common.c
│   │   │   │   ├── compress/
│   │   │   │   │   └── compress_test.c
│   │   │   │   ├── datetime/
│   │   │   │   │   └── datetimelib_test.c
│   │   │   │   ├── dialogs_file_browser_options/
│   │   │   │   │   └── dialogs_file_browser_options.c
│   │   │   │   ├── dirwalk/
│   │   │   │   │   └── dirwalk_test.c
│   │   │   │   ├── expansion/
│   │   │   │   │   └── expansion_test.c
│   │   │   │   ├── flipper_format/
│   │   │   │   │   └── flipper_format_test.c
│   │   │   │   ├── flipper_format_string/
│   │   │   │   │   └── flipper_format_string_test.c
│   │   │   │   ├── float_tools/
│   │   │   │   │   └── float_tools_test.c
│   │   │   │   ├── furi/
│   │   │   │   │   ├── furi_errno_test.c
│   │   │   │   │   ├── furi_event_loop_test.c
│   │   │   │   │   ├── furi_memmgr_test.c
│   │   │   │   │   ├── furi_primitives_test.c
│   │   │   │   │   ├── furi_pubsub_test.c
│   │   │   │   │   ├── furi_record_test.c
│   │   │   │   │   ├── furi_stdio_test.c
│   │   │   │   │   └── furi_test.c
│   │   │   │   ├── furi_hal/
│   │   │   │   │   └── furi_hal_tests.c
│   │   │   │   ├── furi_hal_crypto/
│   │   │   │   │   └── furi_hal_crypto_tests.c
│   │   │   │   ├── furi_string/
│   │   │   │   │   └── furi_string_test.c
│   │   │   │   ├── infrared/
│   │   │   │   │   └── infrared_test.c
│   │   │   │   ├── js/
│   │   │   │   │   └── js_test.c
│   │   │   │   ├── lfrfid/
│   │   │   │   │   └── lfrfid_protocols.c
│   │   │   │   ├── manifest/
│   │   │   │   │   └── manifest.c
│   │   │   │   ├── minunit.h
│   │   │   │   ├── minunit_vars.h
│   │   │   │   ├── minunit_vars_ex.h
│   │   │   │   ├── nfc/
│   │   │   │   │   └── nfc_test.c
│   │   │   │   ├── notification/
│   │   │   │   │   └── notes_test.c
│   │   │   │   ├── pipe/
│   │   │   │   │   └── pipe_test.c
│   │   │   │   ├── power/
│   │   │   │   │   └── power_test.c
│   │   │   │   ├── protocol_dict/
│   │   │   │   │   └── protocol_dict_test.c
│   │   │   │   ├── rpc/
│   │   │   │   │   └── rpc_test.c
│   │   │   │   ├── storage/
│   │   │   │   │   └── storage_test.c
│   │   │   │   ├── stream/
│   │   │   │   │   └── stream_test.c
│   │   │   │   ├── strint/
│   │   │   │   │   └── strint_test.c
│   │   │   │   ├── subghz/
│   │   │   │   │   └── subghz_test.c
│   │   │   │   ├── test.h
│   │   │   │   ├── test_api.h
│   │   │   │   └── varint/
│   │   │   │       └── varint_test.c
│   │   │   ├── unit_test_api_table.cpp
│   │   │   ├── unit_test_api_table_i.h
│   │   │   └── unit_tests.c
│   │   ├── usb_mouse/
│   │   │   ├── application.fam
│   │   │   └── usb_mouse.c
│   │   ├── usb_test/
│   │   │   ├── application.fam
│   │   │   └── usb_test.c
│   │   └── vibro_test/
│   │       ├── application.fam
│   │       └── vibro_test.c
│   ├── drivers/
│   │   ├── application.fam
│   │   └── subghz/
│   │       ├── application.fam
│   │       └── cc1101_ext/
│   │           ├── cc1101_ext.c
│   │           ├── cc1101_ext.h
│   │           ├── cc1101_ext_interconnect.c
│   │           └── cc1101_ext_interconnect.h
│   ├── examples/
│   │   ├── application.fam
│   │   ├── example_adc/
│   │   │   ├── application.fam
│   │   │   └── example_adc.c
│   │   ├── example_apps_assets/
│   │   │   ├── README.md
│   │   │   ├── application.fam
│   │   │   ├── example_apps_assets.c
│   │   │   └── files/
│   │   │       ├── poems/
│   │   │       │   ├── a jelly-fish.txt
│   │   │       │   ├── my shadow.txt
│   │   │       │   └── theme in yellow.txt
│   │   │       └── test_asset.txt
│   │   ├── example_apps_data/
│   │   │   ├── README.md
│   │   │   ├── application.fam
│   │   │   └── example_apps_data.c
│   │   ├── example_ble_beacon/
│   │   │   ├── application.fam
│   │   │   ├── ble_beacon_app.c
│   │   │   ├── ble_beacon_app.h
│   │   │   └── scenes/
│   │   │       ├── scene_config.h
│   │   │       ├── scene_input_beacon_data.c
│   │   │       ├── scene_input_mac_addr.c
│   │   │       ├── scene_menu.c
│   │   │       ├── scene_run_beacon.c
│   │   │       ├── scenes.c
│   │   │       └── scenes.h
│   │   ├── example_custom_font/
│   │   │   ├── application.fam
│   │   │   └── example_custom_font.c
│   │   ├── example_event_loop/
│   │   │   ├── application.fam
│   │   │   ├── example_event_loop_event_flags.c
│   │   │   ├── example_event_loop_multi.c
│   │   │   ├── example_event_loop_mutex.c
│   │   │   ├── example_event_loop_stream_buffer.c
│   │   │   └── example_event_loop_timer.c
│   │   ├── example_images/
│   │   │   ├── ReadMe.md
│   │   │   ├── application.fam
│   │   │   └── example_images.c
│   │   ├── example_number_input/
│   │   │   ├── ReadMe.md
│   │   │   ├── application.fam
│   │   │   ├── example_number_input.c
│   │   │   ├── example_number_input.h
│   │   │   └── scenes/
│   │   │       ├── example_number_input_scene.c
│   │   │       ├── example_number_input_scene.h
│   │   │       ├── example_number_input_scene_config.h
│   │   │       ├── example_number_input_scene_input_max.c
│   │   │       ├── example_number_input_scene_input_min.c
│   │   │       ├── example_number_input_scene_input_number.c
│   │   │       └── example_number_input_scene_show_number.c
│   │   ├── example_plugins/
│   │   │   ├── application.fam
│   │   │   ├── example_plugins.c
│   │   │   ├── example_plugins_multi.c
│   │   │   ├── plugin1.c
│   │   │   ├── plugin2.c
│   │   │   └── plugin_interface.h
│   │   ├── example_plugins_advanced/
│   │   │   ├── app_api.c
│   │   │   ├── app_api.h
│   │   │   ├── app_api_interface.h
│   │   │   ├── app_api_table.cpp
│   │   │   ├── app_api_table_i.h
│   │   │   ├── application.fam
│   │   │   ├── example_advanced_plugins.c
│   │   │   ├── plugin1.c
│   │   │   ├── plugin2.c
│   │   │   └── plugin_interface.h
│   │   ├── example_thermo/
│   │   │   ├── README.md
│   │   │   ├── application.fam
│   │   │   └── example_thermo.c
│   │   ├── example_view_dispatcher/
│   │   │   ├── application.fam
│   │   │   └── example_view_dispatcher.c
│   │   └── example_view_holder/
│   │       ├── application.fam
│   │       └── example_view_holder.c
│   ├── main/
│   │   ├── application.fam
│   │   ├── archive/
│   │   │   ├── application.fam
│   │   │   ├── archive.c
│   │   │   ├── archive.h
│   │   │   ├── archive_i.h
│   │   │   ├── helpers/
│   │   │   │   ├── archive_apps.c
│   │   │   │   ├── archive_apps.h
│   │   │   │   ├── archive_browser.c
│   │   │   │   ├── archive_browser.h
│   │   │   │   ├── archive_favorites.c
│   │   │   │   ├── archive_favorites.h
│   │   │   │   ├── archive_files.c
│   │   │   │   └── archive_files.h
│   │   │   ├── scenes/
│   │   │   │   ├── archive_scene.c
│   │   │   │   ├── archive_scene.h
│   │   │   │   ├── archive_scene_browser.c
│   │   │   │   ├── archive_scene_config.h
│   │   │   │   ├── archive_scene_delete.c
│   │   │   │   └── archive_scene_rename.c
│   │   │   └── views/
│   │   │       ├── archive_browser_view.c
│   │   │       └── archive_browser_view.h
│   │   ├── bad_usb/
│   │   │   ├── application.fam
│   │   │   ├── bad_usb_app.c
│   │   │   ├── bad_usb_app.h
│   │   │   ├── bad_usb_app_i.h
│   │   │   ├── helpers/
│   │   │   │   ├── bad_usb_hid.c
│   │   │   │   ├── bad_usb_hid.h
│   │   │   │   ├── ducky_script.c
│   │   │   │   ├── ducky_script.h
│   │   │   │   ├── ducky_script_commands.c
│   │   │   │   ├── ducky_script_i.h
│   │   │   │   └── ducky_script_keycodes.c
│   │   │   ├── resources/
│   │   │   │   └── badusb/
│   │   │   │       ├── Install_qFlipper_gnome.txt
│   │   │   │       ├── Install_qFlipper_macOS.txt
│   │   │   │       ├── Install_qFlipper_windows.txt
│   │   │   │       ├── assets/
│   │   │   │       │   └── layouts/
│   │   │   │       │       ├── ba-BA.kl
│   │   │   │       │       ├── cz_CS.kl
│   │   │   │       │       ├── da-DA.kl
│   │   │   │       │       ├── de-CH.kl
│   │   │   │       │       ├── de-DE.kl
│   │   │   │       │       ├── dvorak.kl
│   │   │   │       │       ├── en-UK.kl
│   │   │   │       │       ├── en-US.kl
│   │   │   │       │       ├── es-ES.kl
│   │   │   │       │       ├── es-LA.kl
│   │   │   │       │       ├── fr-BE.kl
│   │   │   │       │       ├── fr-CA.kl
│   │   │   │       │       ├── fr-CH.kl
│   │   │   │       │       ├── fr-FR-mac.kl
│   │   │   │       │       ├── fr-FR.kl
│   │   │   │       │       ├── hr-HR.kl
│   │   │   │       │       ├── hu-HU.kl
│   │   │   │       │       ├── it-IT-mac.kl
│   │   │   │       │       ├── it-IT.kl
│   │   │   │       │       ├── nb-NO.kl
│   │   │   │       │       ├── nl-NL.kl
│   │   │   │       │       ├── pt-BR.kl
│   │   │   │       │       ├── pt-PT.kl
│   │   │   │       │       ├── si-SI.kl
│   │   │   │       │       ├── sk-SK.kl
│   │   │   │       │       ├── sv-SE.kl
│   │   │   │       │       └── tr-TR.kl
│   │   │   │       ├── demo_chromeos.txt
│   │   │   │       ├── demo_gnome.txt
│   │   │   │       ├── demo_macos.txt
│   │   │   │       ├── demo_windows.txt
│   │   │   │       └── test_mouse.txt
│   │   │   ├── scenes/
│   │   │   │   ├── bad_usb_scene.c
│   │   │   │   ├── bad_usb_scene.h
│   │   │   │   ├── bad_usb_scene_config.c
│   │   │   │   ├── bad_usb_scene_config.h
│   │   │   │   ├── bad_usb_scene_config_layout.c
│   │   │   │   ├── bad_usb_scene_confirm_unpair.c
│   │   │   │   ├── bad_usb_scene_error.c
│   │   │   │   ├── bad_usb_scene_file_select.c
│   │   │   │   ├── bad_usb_scene_unpair_done.c
│   │   │   │   └── bad_usb_scene_work.c
│   │   │   └── views/
│   │   │       ├── bad_usb_view.c
│   │   │       └── bad_usb_view.h
│   │   ├── gpio/
│   │   │   ├── application.fam
│   │   │   ├── gpio_app.c
│   │   │   ├── gpio_app.h
│   │   │   ├── gpio_app_i.h
│   │   │   ├── gpio_custom_event.h
│   │   │   ├── gpio_items.c
│   │   │   ├── gpio_items.h
│   │   │   ├── scenes/
│   │   │   │   ├── gpio_scene.c
│   │   │   │   ├── gpio_scene.h
│   │   │   │   ├── gpio_scene_config.h
│   │   │   │   ├── gpio_scene_start.c
│   │   │   │   ├── gpio_scene_test.c
│   │   │   │   ├── gpio_scene_usb_uart.c
│   │   │   │   ├── gpio_scene_usb_uart_close_rpc.c
│   │   │   │   └── gpio_scene_usb_uart_config.c
│   │   │   ├── usb_uart_bridge.c
│   │   │   ├── usb_uart_bridge.h
│   │   │   └── views/
│   │   │       ├── gpio_test.c
│   │   │       ├── gpio_test.h
│   │   │       ├── gpio_usb_uart.c
│   │   │       └── gpio_usb_uart.h
│   │   ├── ibutton/
│   │   │   ├── application.fam
│   │   │   ├── ibutton.c
│   │   │   ├── ibutton.h
│   │   │   ├── ibutton_cli.c
│   │   │   ├── ibutton_custom_event.h
│   │   │   ├── ibutton_i.h
│   │   │   └── scenes/
│   │   │       ├── ibutton_scene.c
│   │   │       ├── ibutton_scene.h
│   │   │       ├── ibutton_scene_add_type.c
│   │   │       ├── ibutton_scene_add_value.c
│   │   │       ├── ibutton_scene_config.h
│   │   │       ├── ibutton_scene_delete_confirm.c
│   │   │       ├── ibutton_scene_delete_success.c
│   │   │       ├── ibutton_scene_emulate.c
│   │   │       ├── ibutton_scene_exit_confirm.c
│   │   │       ├── ibutton_scene_info.c
│   │   │       ├── ibutton_scene_read.c
│   │   │       ├── ibutton_scene_read_error.c
│   │   │       ├── ibutton_scene_read_key_menu.c
│   │   │       ├── ibutton_scene_read_success.c
│   │   │       ├── ibutton_scene_retry_confirm.c
│   │   │       ├── ibutton_scene_rpc.c
│   │   │       ├── ibutton_scene_save_name.c
│   │   │       ├── ibutton_scene_save_success.c
│   │   │       ├── ibutton_scene_saved_key_menu.c
│   │   │       ├── ibutton_scene_select_key.c
│   │   │       ├── ibutton_scene_start.c
│   │   │       ├── ibutton_scene_view_data.c
│   │   │       ├── ibutton_scene_write.c
│   │   │       └── ibutton_scene_write_success.c
│   │   ├── infrared/
│   │   │   ├── application.fam
│   │   │   ├── infrared_app.c
│   │   │   ├── infrared_app.h
│   │   │   ├── infrared_app_i.h
│   │   │   ├── infrared_cli.c
│   │   │   ├── infrared_custom_event.h
│   │   │   ├── infrared_remote.c
│   │   │   ├── infrared_remote.h
│   │   │   ├── resources/
│   │   │   │   └── infrared/
│   │   │   │       └── assets/
│   │   │   │           ├── ac.ir
│   │   │   │           ├── audio.ir
│   │   │   │           ├── projector.ir
│   │   │   │           └── tv.ir
│   │   │   ├── scenes/
│   │   │   │   ├── common/
│   │   │   │   │   ├── infrared_scene_universal_common.c
│   │   │   │   │   └── infrared_scene_universal_common.h
│   │   │   │   ├── infrared_scene.c
│   │   │   │   ├── infrared_scene.h
│   │   │   │   ├── infrared_scene_ask_back.c
│   │   │   │   ├── infrared_scene_ask_retry.c
│   │   │   │   ├── infrared_scene_config.h
│   │   │   │   ├── infrared_scene_debug.c
│   │   │   │   ├── infrared_scene_edit.c
│   │   │   │   ├── infrared_scene_edit_button_select.c
│   │   │   │   ├── infrared_scene_edit_delete.c
│   │   │   │   ├── infrared_scene_edit_delete_done.c
│   │   │   │   ├── infrared_scene_edit_move.c
│   │   │   │   ├── infrared_scene_edit_rename.c
│   │   │   │   ├── infrared_scene_edit_rename_done.c
│   │   │   │   ├── infrared_scene_error_databases.c
│   │   │   │   ├── infrared_scene_gpio_settings.c
│   │   │   │   ├── infrared_scene_learn.c
│   │   │   │   ├── infrared_scene_learn_done.c
│   │   │   │   ├── infrared_scene_learn_enter_name.c
│   │   │   │   ├── infrared_scene_learn_success.c
│   │   │   │   ├── infrared_scene_remote.c
│   │   │   │   ├── infrared_scene_remote_list.c
│   │   │   │   ├── infrared_scene_rpc.c
│   │   │   │   ├── infrared_scene_start.c
│   │   │   │   ├── infrared_scene_universal.c
│   │   │   │   ├── infrared_scene_universal_ac.c
│   │   │   │   ├── infrared_scene_universal_audio.c
│   │   │   │   ├── infrared_scene_universal_projector.c
│   │   │   │   └── infrared_scene_universal_tv.c
│   │   │   └── views/
│   │   │       ├── infrared_debug_view.c
│   │   │       ├── infrared_debug_view.h
│   │   │       ├── infrared_move_view.c
│   │   │       ├── infrared_move_view.h
│   │   │       ├── infrared_progress_view.c
│   │   │       └── infrared_progress_view.h
│   │   ├── lfrfid/
│   │   │   ├── application.fam
│   │   │   ├── lfrfid.c
│   │   │   ├── lfrfid_cli.c
│   │   │   ├── lfrfid_i.h
│   │   │   ├── resources/
│   │   │   │   └── lfrfid/
│   │   │   │       └── assets/
│   │   │   │           └── iso3166.lfrfid
│   │   │   ├── scenes/
│   │   │   │   ├── lfrfid_scene.c
│   │   │   │   ├── lfrfid_scene.h
│   │   │   │   ├── lfrfid_scene_config.h
│   │   │   │   ├── lfrfid_scene_delete_confirm.c
│   │   │   │   ├── lfrfid_scene_delete_success.c
│   │   │   │   ├── lfrfid_scene_emulate.c
│   │   │   │   ├── lfrfid_scene_exit_confirm.c
│   │   │   │   ├── lfrfid_scene_extra_actions.c
│   │   │   │   ├── lfrfid_scene_raw_info.c
│   │   │   │   ├── lfrfid_scene_raw_name.c
│   │   │   │   ├── lfrfid_scene_raw_read.c
│   │   │   │   ├── lfrfid_scene_raw_success.c
│   │   │   │   ├── lfrfid_scene_read.c
│   │   │   │   ├── lfrfid_scene_read_key_menu.c
│   │   │   │   ├── lfrfid_scene_read_success.c
│   │   │   │   ├── lfrfid_scene_retry_confirm.c
│   │   │   │   ├── lfrfid_scene_rpc.c
│   │   │   │   ├── lfrfid_scene_save_data.c
│   │   │   │   ├── lfrfid_scene_save_name.c
│   │   │   │   ├── lfrfid_scene_save_success.c
│   │   │   │   ├── lfrfid_scene_save_type.c
│   │   │   │   ├── lfrfid_scene_saved_info.c
│   │   │   │   ├── lfrfid_scene_saved_key_menu.c
│   │   │   │   ├── lfrfid_scene_select_key.c
│   │   │   │   ├── lfrfid_scene_start.c
│   │   │   │   ├── lfrfid_scene_write.c
│   │   │   │   └── lfrfid_scene_write_success.c
│   │   │   └── views/
│   │   │       ├── lfrfid_view_read.c
│   │   │       └── lfrfid_view_read.h
│   │   ├── nfc/
│   │   │   ├── api/
│   │   │   │   ├── gallagher/
│   │   │   │   │   ├── gallagher_util.c
│   │   │   │   │   └── gallagher_util.h
│   │   │   │   ├── mosgortrans/
│   │   │   │   │   ├── mosgortrans_util.c
│   │   │   │   │   └── mosgortrans_util.h
│   │   │   │   ├── nfc_app_api_interface.h
│   │   │   │   ├── nfc_app_api_table.cpp
│   │   │   │   └── nfc_app_api_table_i.h
│   │   │   ├── application.fam
│   │   │   ├── cli/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── apdu/
│   │   │   │   │   │   ├── nfc_cli_command_apdu.c
│   │   │   │   │   │   ├── nfc_cli_command_apdu.h
│   │   │   │   │   │   └── protocol_handlers/
│   │   │   │   │   │       ├── iso14443_4a/
│   │   │   │   │   │       │   ├── nfc_cli_apdu_iso14443_4a.c
│   │   │   │   │   │       │   └── nfc_cli_apdu_iso14443_4a.h
│   │   │   │   │   │       ├── iso14443_4b/
│   │   │   │   │   │       │   ├── nfc_cli_apdu_iso14443_4b.c
│   │   │   │   │   │       │   └── nfc_cli_apdu_iso14443_4b.h
│   │   │   │   │   │       ├── iso15693_3/
│   │   │   │   │   │       │   ├── nfc_cli_apdu_iso15693_3.c
│   │   │   │   │   │       │   └── nfc_cli_apdu_iso15693_3.h
│   │   │   │   │   │       └── nfc_cli_apdu_common_types.h
│   │   │   │   │   ├── dump/
│   │   │   │   │   │   ├── nfc_cli_command_dump.c
│   │   │   │   │   │   ├── nfc_cli_command_dump.h
│   │   │   │   │   │   └── protocols/
│   │   │   │   │   │       ├── felica/
│   │   │   │   │   │       │   ├── nfc_cli_dump_felica.c
│   │   │   │   │   │       │   └── nfc_cli_dump_felica.h
│   │   │   │   │   │       ├── iso14443_3a/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_3a.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_3a.h
│   │   │   │   │   │       ├── iso14443_3b/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_3b.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_3b.h
│   │   │   │   │   │       ├── iso14443_4a/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_4a.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_4a.h
│   │   │   │   │   │       ├── iso14443_4b/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_4b.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_4b.h
│   │   │   │   │   │       ├── iso15693_3/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso15693_3.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso15693_3.h
│   │   │   │   │   │       ├── mf_classic/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_classic.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_classic.h
│   │   │   │   │   │       ├── mf_desfire/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_desfire.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_desfire.h
│   │   │   │   │   │       ├── mf_plus/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_plus.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_plus.h
│   │   │   │   │   │       ├── mf_ultralight/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_ultralight.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_ultralight.h
│   │   │   │   │   │       ├── nfc_cli_dump_common_types.h
│   │   │   │   │   │       ├── slix/
│   │   │   │   │   │       │   ├── nfc_cli_dump_slix.c
│   │   │   │   │   │       │   └── nfc_cli_dump_slix.h
│   │   │   │   │   │       └── st25tb/
│   │   │   │   │   │           ├── nfc_cli_dump_st25tb.c
│   │   │   │   │   │           └── nfc_cli_dump_st25tb.h
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── nfc_cli_format.c
│   │   │   │   │   │   ├── nfc_cli_format.h
│   │   │   │   │   │   ├── nfc_cli_protocol_parser.c
│   │   │   │   │   │   ├── nfc_cli_protocol_parser.h
│   │   │   │   │   │   ├── nfc_cli_scanner.c
│   │   │   │   │   │   └── nfc_cli_scanner.h
│   │   │   │   │   ├── mfu/
│   │   │   │   │   │   ├── nfc_cli_action_info.c
│   │   │   │   │   │   ├── nfc_cli_action_info.h
│   │   │   │   │   │   ├── nfc_cli_action_rdbl.c
│   │   │   │   │   │   ├── nfc_cli_action_rdbl.h
│   │   │   │   │   │   ├── nfc_cli_action_wrbl.c
│   │   │   │   │   │   ├── nfc_cli_action_wrbl.h
│   │   │   │   │   │   ├── nfc_cli_command_mfu.c
│   │   │   │   │   │   └── nfc_cli_command_mfu.h
│   │   │   │   │   ├── nfc_cli_command_emulate.c
│   │   │   │   │   ├── nfc_cli_command_emulate.h
│   │   │   │   │   ├── nfc_cli_command_field.c
│   │   │   │   │   ├── nfc_cli_command_field.h
│   │   │   │   │   ├── nfc_cli_command_scanner.c
│   │   │   │   │   ├── nfc_cli_command_scanner.h
│   │   │   │   │   └── raw/
│   │   │   │   │       ├── nfc_cli_command_raw.c
│   │   │   │   │       ├── nfc_cli_command_raw.h
│   │   │   │   │       └── protocol_handlers/
│   │   │   │   │           ├── felica/
│   │   │   │   │           │   ├── nfc_cli_raw_felica.c
│   │   │   │   │           │   └── nfc_cli_raw_felica.h
│   │   │   │   │           ├── iso14443_3a/
│   │   │   │   │           │   ├── nfc_cli_raw_iso14443_3a.c
│   │   │   │   │           │   └── nfc_cli_raw_iso14443_3a.h
│   │   │   │   │           ├── iso14443_3b/
│   │   │   │   │           │   ├── nfc_cli_raw_iso14443_3b.c
│   │   │   │   │           │   └── nfc_cli_raw_iso14443_3b.h
│   │   │   │   │           ├── iso15693_3/
│   │   │   │   │           │   ├── nfc_cli_raw_iso15693_3.c
│   │   │   │   │           │   └── nfc_cli_raw_iso15693_3.h
│   │   │   │   │           └── nfc_cli_raw_common_types.h
│   │   │   │   ├── nfc_cli.c
│   │   │   │   ├── nfc_cli_command_base.h
│   │   │   │   ├── nfc_cli_command_base_i.h
│   │   │   │   ├── nfc_cli_command_processor.c
│   │   │   │   ├── nfc_cli_command_processor.h
│   │   │   │   ├── nfc_cli_commands.c
│   │   │   │   └── nfc_cli_commands.h
│   │   │   ├── helpers/
│   │   │   │   ├── felica_auth.c
│   │   │   │   ├── felica_auth.h
│   │   │   │   ├── mf_classic_key_cache.c
│   │   │   │   ├── mf_classic_key_cache.h
│   │   │   │   ├── mf_ultralight_auth.c
│   │   │   │   ├── mf_ultralight_auth.h
│   │   │   │   ├── mf_user_dict.c
│   │   │   │   ├── mf_user_dict.h
│   │   │   │   ├── mfkey32_logger.c
│   │   │   │   ├── mfkey32_logger.h
│   │   │   │   ├── nfc_custom_event.h
│   │   │   │   ├── nfc_detected_protocols.c
│   │   │   │   ├── nfc_detected_protocols.h
│   │   │   │   ├── nfc_emv_parser.c
│   │   │   │   ├── nfc_emv_parser.h
│   │   │   │   ├── nfc_supported_cards.c
│   │   │   │   ├── nfc_supported_cards.h
│   │   │   │   ├── protocol_support/
│   │   │   │   │   ├── felica/
│   │   │   │   │   │   ├── felica.c
│   │   │   │   │   │   ├── felica.h
│   │   │   │   │   │   ├── felica_render.c
│   │   │   │   │   │   └── felica_render.h
│   │   │   │   │   ├── iso14443_3a/
│   │   │   │   │   │   ├── iso14443_3a.c
│   │   │   │   │   │   ├── iso14443_3a.h
│   │   │   │   │   │   ├── iso14443_3a_render.c
│   │   │   │   │   │   └── iso14443_3a_render.h
│   │   │   │   │   ├── iso14443_3b/
│   │   │   │   │   │   ├── iso14443_3b.c
│   │   │   │   │   │   ├── iso14443_3b.h
│   │   │   │   │   │   ├── iso14443_3b_i.h
│   │   │   │   │   │   ├── iso14443_3b_render.c
│   │   │   │   │   │   └── iso14443_3b_render.h
│   │   │   │   │   ├── iso14443_4a/
│   │   │   │   │   │   ├── iso14443_4a.c
│   │   │   │   │   │   ├── iso14443_4a.h
│   │   │   │   │   │   ├── iso14443_4a_i.h
│   │   │   │   │   │   ├── iso14443_4a_render.c
│   │   │   │   │   │   └── iso14443_4a_render.h
│   │   │   │   │   ├── iso14443_4b/
│   │   │   │   │   │   ├── iso14443_4b.c
│   │   │   │   │   │   ├── iso14443_4b.h
│   │   │   │   │   │   ├── iso14443_4b_render.c
│   │   │   │   │   │   └── iso14443_4b_render.h
│   │   │   │   │   ├── iso15693_3/
│   │   │   │   │   │   ├── iso15693_3.c
│   │   │   │   │   │   ├── iso15693_3.h
│   │   │   │   │   │   ├── iso15693_3_render.c
│   │   │   │   │   │   └── iso15693_3_render.h
│   │   │   │   │   ├── mf_classic/
│   │   │   │   │   │   ├── mf_classic.c
│   │   │   │   │   │   ├── mf_classic.h
│   │   │   │   │   │   ├── mf_classic_render.c
│   │   │   │   │   │   └── mf_classic_render.h
│   │   │   │   │   ├── mf_desfire/
│   │   │   │   │   │   ├── mf_desfire.c
│   │   │   │   │   │   ├── mf_desfire.h
│   │   │   │   │   │   ├── mf_desfire_render.c
│   │   │   │   │   │   └── mf_desfire_render.h
│   │   │   │   │   ├── mf_plus/
│   │   │   │   │   │   ├── mf_plus.c
│   │   │   │   │   │   ├── mf_plus.h
│   │   │   │   │   │   ├── mf_plus_render.c
│   │   │   │   │   │   └── mf_plus_render.h
│   │   │   │   │   ├── mf_ultralight/
│   │   │   │   │   │   ├── mf_ultralight.c
│   │   │   │   │   │   ├── mf_ultralight.h
│   │   │   │   │   │   ├── mf_ultralight_render.c
│   │   │   │   │   │   └── mf_ultralight_render.h
│   │   │   │   │   ├── nfc_protocol_support.c
│   │   │   │   │   ├── nfc_protocol_support.h
│   │   │   │   │   ├── nfc_protocol_support_base.h
│   │   │   │   │   ├── nfc_protocol_support_common.h
│   │   │   │   │   ├── nfc_protocol_support_defs.c
│   │   │   │   │   ├── nfc_protocol_support_defs.h
│   │   │   │   │   ├── nfc_protocol_support_gui_common.c
│   │   │   │   │   ├── nfc_protocol_support_gui_common.h
│   │   │   │   │   ├── nfc_protocol_support_render_common.h
│   │   │   │   │   ├── nfc_protocol_support_unlock_helper.c
│   │   │   │   │   ├── nfc_protocol_support_unlock_helper.h
│   │   │   │   │   ├── slix/
│   │   │   │   │   │   ├── slix.c
│   │   │   │   │   │   ├── slix.h
│   │   │   │   │   │   ├── slix_render.c
│   │   │   │   │   │   └── slix_render.h
│   │   │   │   │   └── st25tb/
│   │   │   │   │       ├── st25tb.c
│   │   │   │   │       ├── st25tb.h
│   │   │   │   │       ├── st25tb_render.c
│   │   │   │   │       └── st25tb_render.h
│   │   │   │   ├── slix_unlock.c
│   │   │   │   └── slix_unlock.h
│   │   │   ├── nfc_app.c
│   │   │   ├── nfc_app.h
│   │   │   ├── nfc_app_i.h
│   │   │   ├── plugins/
│   │   │   │   └── supported_cards/
│   │   │   │       ├── aic.c
│   │   │   │       ├── aime.c
│   │   │   │       ├── all_in_one.c
│   │   │   │       ├── banapass.c
│   │   │   │       ├── bip.c
│   │   │   │       ├── clipper.c
│   │   │   │       ├── disney_infinity.c
│   │   │   │       ├── gallagher.c
│   │   │   │       ├── hi.c
│   │   │   │       ├── hid.c
│   │   │   │       ├── hworld.c
│   │   │   │       ├── itso.c
│   │   │   │       ├── microel.c
│   │   │   │       ├── mizip.c
│   │   │   │       ├── mykey.c
│   │   │   │       ├── myki.c
│   │   │   │       ├── ndef.c
│   │   │   │       ├── nfc_supported_card_plugin.h
│   │   │   │       ├── opal.c
│   │   │   │       ├── plantain.c
│   │   │   │       ├── skylanders.c
│   │   │   │       ├── social_moscow.c
│   │   │   │       ├── troika.c
│   │   │   │       ├── trt.c
│   │   │   │       ├── two_cities.c
│   │   │   │       ├── umarsh.c
│   │   │   │       └── washcity.c
│   │   │   ├── resources/
│   │   │   │   └── nfc/
│   │   │   │       └── assets/
│   │   │   │           ├── aid.nfc
│   │   │   │           ├── country_code.nfc
│   │   │   │           ├── currency_code.nfc
│   │   │   │           ├── mf_classic_dict.nfc
│   │   │   │           ├── mf_ultralight_c_dict.nfc
│   │   │   │           ├── skylanders.nfc
│   │   │   │           └── vendors.nfc
│   │   │   ├── scenes/
│   │   │   │   ├── nfc_scene.c
│   │   │   │   ├── nfc_scene.h
│   │   │   │   ├── nfc_scene_config.h
│   │   │   │   ├── nfc_scene_debug.c
│   │   │   │   ├── nfc_scene_delete.c
│   │   │   │   ├── nfc_scene_delete_success.c
│   │   │   │   ├── nfc_scene_des_auth_key_input.c
│   │   │   │   ├── nfc_scene_des_auth_unlock_warn.c
│   │   │   │   ├── nfc_scene_detect.c
│   │   │   │   ├── nfc_scene_emulate.c
│   │   │   │   ├── nfc_scene_exit_confirm.c
│   │   │   │   ├── nfc_scene_extra_actions.c
│   │   │   │   ├── nfc_scene_felica_more_info.c
│   │   │   │   ├── nfc_scene_felica_system.c
│   │   │   │   ├── nfc_scene_field.c
│   │   │   │   ├── nfc_scene_file_select.c
│   │   │   │   ├── nfc_scene_generate_info.c
│   │   │   │   ├── nfc_scene_info.c
│   │   │   │   ├── nfc_scene_mf_classic_detect_reader.c
│   │   │   │   ├── nfc_scene_mf_classic_dict_attack.c
│   │   │   │   ├── nfc_scene_mf_classic_keys.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_add.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_delete.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_list.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_warn_duplicate.c
│   │   │   │   ├── nfc_scene_mf_classic_mfkey_complete.c
│   │   │   │   ├── nfc_scene_mf_classic_mfkey_nonces_info.c
│   │   │   │   ├── nfc_scene_mf_classic_update_initial.c
│   │   │   │   ├── nfc_scene_mf_classic_update_initial_success.c
│   │   │   │   ├── nfc_scene_mf_classic_update_initial_wrong_card.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial_fail.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial_success.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial_wrong_card.c
│   │   │   │   ├── nfc_scene_mf_desfire_app.c
│   │   │   │   ├── nfc_scene_mf_desfire_more_info.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_dict_attack.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_add.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_delete.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_list.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_warn_duplicate.c
│   │   │   │   ├── nfc_scene_mf_ultralight_capture_pass.c
│   │   │   │   ├── nfc_scene_mf_ultralight_key_input.c
│   │   │   │   ├── nfc_scene_mf_ultralight_unlock_menu.c
│   │   │   │   ├── nfc_scene_mf_ultralight_unlock_warn.c
│   │   │   │   ├── nfc_scene_mf_ultralight_write.c
│   │   │   │   ├── nfc_scene_mf_ultralight_write_fail.c
│   │   │   │   ├── nfc_scene_mf_ultralight_write_success.c
│   │   │   │   ├── nfc_scene_mf_ultralight_wrong_card.c
│   │   │   │   ├── nfc_scene_more_info.c
│   │   │   │   ├── nfc_scene_read.c
│   │   │   │   ├── nfc_scene_read_menu.c
│   │   │   │   ├── nfc_scene_read_success.c
│   │   │   │   ├── nfc_scene_restore_original.c
│   │   │   │   ├── nfc_scene_restore_original_confirm.c
│   │   │   │   ├── nfc_scene_retry_confirm.c
│   │   │   │   ├── nfc_scene_rpc.c
│   │   │   │   ├── nfc_scene_save_confirm.c
│   │   │   │   ├── nfc_scene_save_name.c
│   │   │   │   ├── nfc_scene_save_success.c
│   │   │   │   ├── nfc_scene_saved_menu.c
│   │   │   │   ├── nfc_scene_select_protocol.c
│   │   │   │   ├── nfc_scene_set_atqa.c
│   │   │   │   ├── nfc_scene_set_sak.c
│   │   │   │   ├── nfc_scene_set_type.c
│   │   │   │   ├── nfc_scene_set_uid.c
│   │   │   │   ├── nfc_scene_slix_key_input.c
│   │   │   │   ├── nfc_scene_slix_unlock.c
│   │   │   │   ├── nfc_scene_slix_unlock_menu.c
│   │   │   │   ├── nfc_scene_slix_unlock_success.c
│   │   │   │   ├── nfc_scene_start.c
│   │   │   │   └── nfc_scene_supported_card.c
│   │   │   └── views/
│   │   │       ├── detect_reader.c
│   │   │       ├── detect_reader.h
│   │   │       ├── dict_attack.c
│   │   │       └── dict_attack.h
│   │   ├── onewire/
│   │   │   ├── application.fam
│   │   │   └── onewire_cli.c
│   │   ├── subghz/
│   │   │   ├── application.fam
│   │   │   ├── helpers/
│   │   │   │   ├── subghz_chat.c
│   │   │   │   ├── subghz_chat.h
│   │   │   │   ├── subghz_custom_event.h
│   │   │   │   ├── subghz_frequency_analyzer_log_item_array.c
│   │   │   │   ├── subghz_frequency_analyzer_log_item_array.h
│   │   │   │   ├── subghz_frequency_analyzer_worker.c
│   │   │   │   ├── subghz_frequency_analyzer_worker.h
│   │   │   │   ├── subghz_threshold_rssi.c
│   │   │   │   ├── subghz_threshold_rssi.h
│   │   │   │   ├── subghz_txrx.c
│   │   │   │   ├── subghz_txrx.h
│   │   │   │   ├── subghz_txrx_create_protocol_key.c
│   │   │   │   ├── subghz_txrx_create_protocol_key.h
│   │   │   │   ├── subghz_txrx_i.h
│   │   │   │   └── subghz_types.h
│   │   │   ├── resources/
│   │   │   │   └── subghz/
│   │   │   │       └── assets/
│   │   │   │           ├── alutech_at_4n
│   │   │   │           ├── came_atomo
│   │   │   │           ├── keeloq_mfcodes
│   │   │   │           ├── keeloq_mfcodes_user.example
│   │   │   │           ├── nice_flor_s
│   │   │   │           └── setting_user.example
│   │   │   ├── scenes/
│   │   │   │   ├── subghz_scene.c
│   │   │   │   ├── subghz_scene.h
│   │   │   │   ├── subghz_scene_config.h
│   │   │   │   ├── subghz_scene_delete.c
│   │   │   │   ├── subghz_scene_delete_raw.c
│   │   │   │   ├── subghz_scene_delete_success.c
│   │   │   │   ├── subghz_scene_frequency_analyzer.c
│   │   │   │   ├── subghz_scene_more_raw.c
│   │   │   │   ├── subghz_scene_need_saving.c
│   │   │   │   ├── subghz_scene_radio_setting.c
│   │   │   │   ├── subghz_scene_read_raw.c
│   │   │   │   ├── subghz_scene_receiver.c
│   │   │   │   ├── subghz_scene_receiver_config.c
│   │   │   │   ├── subghz_scene_receiver_info.c
│   │   │   │   ├── subghz_scene_region_info.c
│   │   │   │   ├── subghz_scene_rpc.c
│   │   │   │   ├── subghz_scene_save_name.c
│   │   │   │   ├── subghz_scene_save_success.c
│   │   │   │   ├── subghz_scene_saved.c
│   │   │   │   ├── subghz_scene_saved_menu.c
│   │   │   │   ├── subghz_scene_set_type.c
│   │   │   │   ├── subghz_scene_show_error.c
│   │   │   │   ├── subghz_scene_show_error_sub.c
│   │   │   │   ├── subghz_scene_start.c
│   │   │   │   └── subghz_scene_transmitter.c
│   │   │   ├── subghz.c
│   │   │   ├── subghz.h
│   │   │   ├── subghz_cli.c
│   │   │   ├── subghz_cli.h
│   │   │   ├── subghz_history.c
│   │   │   ├── subghz_history.h
│   │   │   ├── subghz_i.c
│   │   │   ├── subghz_i.h
│   │   │   └── views/
│   │   │       ├── receiver.c
│   │   │       ├── receiver.h
│   │   │       ├── subghz_frequency_analyzer.c
│   │   │       ├── subghz_frequency_analyzer.h
│   │   │       ├── subghz_read_raw.c
│   │   │       ├── subghz_read_raw.h
│   │   │       ├── transmitter.c
│   │   │       └── transmitter.h
│   │   └── u2f/
│   │       ├── application.fam
│   │       ├── resources/
│   │       │   └── u2f/
│   │       │       └── assets/
│   │       │           ├── cert.der
│   │       │           └── cert_key.u2f
│   │       ├── scenes/
│   │       │   ├── u2f_scene.c
│   │       │   ├── u2f_scene.h
│   │       │   ├── u2f_scene_config.h
│   │       │   ├── u2f_scene_error.c
│   │       │   └── u2f_scene_main.c
│   │       ├── u2f.c
│   │       ├── u2f.h
│   │       ├── u2f_app.c
│   │       ├── u2f_app.h
│   │       ├── u2f_app_i.h
│   │       ├── u2f_data.c
│   │       ├── u2f_data.h
│   │       ├── u2f_hid.c
│   │       ├── u2f_hid.h
│   │       └── views/
│   │           ├── u2f_view.c
│   │           └── u2f_view.h
│   ├── services/
│   │   ├── application.fam
│   │   ├── applications.h
│   │   ├── bt/
│   │   │   ├── application.fam
│   │   │   ├── bt_cli.c
│   │   │   ├── bt_service/
│   │   │   │   ├── bt.c
│   │   │   │   ├── bt.h
│   │   │   │   ├── bt_api.c
│   │   │   │   ├── bt_i.h
│   │   │   │   ├── bt_keys_filename.h
│   │   │   │   ├── bt_keys_storage.c
│   │   │   │   ├── bt_keys_storage.h
│   │   │   │   └── bt_settings_api_i.h
│   │   │   ├── bt_settings.c
│   │   │   ├── bt_settings.h
│   │   │   └── bt_settings_filename.h
│   │   ├── cli/
│   │   │   ├── application.fam
│   │   │   ├── cli.h
│   │   │   ├── cli_command_gpio.c
│   │   │   ├── cli_command_gpio.h
│   │   │   ├── cli_main_commands.c
│   │   │   ├── cli_main_commands.h
│   │   │   ├── cli_main_shell.c
│   │   │   ├── cli_main_shell.h
│   │   │   ├── cli_vcp.c
│   │   │   ├── cli_vcp.h
│   │   │   └── commands/
│   │   │       ├── buzzer.c
│   │   │       ├── hello_world.c
│   │   │       ├── neofetch.c
│   │   │       └── subshell_demo.c
│   │   ├── crypto/
│   │   │   ├── application.fam
│   │   │   └── crypto_cli.c
│   │   ├── desktop/
│   │   │   ├── animations/
│   │   │   │   ├── animation_manager.c
│   │   │   │   ├── animation_manager.h
│   │   │   │   ├── animation_storage.c
│   │   │   │   ├── animation_storage.h
│   │   │   │   ├── animation_storage_i.h
│   │   │   │   └── views/
│   │   │   │       ├── bubble_animation_view.c
│   │   │   │       ├── bubble_animation_view.h
│   │   │   │       ├── one_shot_animation_view.c
│   │   │   │       └── one_shot_animation_view.h
│   │   │   ├── application.fam
│   │   │   ├── desktop.c
│   │   │   ├── desktop.h
│   │   │   ├── desktop_i.h
│   │   │   ├── desktop_settings.c
│   │   │   ├── desktop_settings.h
│   │   │   ├── desktop_settings_filename.h
│   │   │   ├── helpers/
│   │   │   │   ├── pin_code.c
│   │   │   │   ├── pin_code.h
│   │   │   │   ├── slideshow.c
│   │   │   │   ├── slideshow.h
│   │   │   │   └── slideshow_filename.h
│   │   │   ├── scenes/
│   │   │   │   ├── desktop_scene.c
│   │   │   │   ├── desktop_scene.h
│   │   │   │   ├── desktop_scene_config.h
│   │   │   │   ├── desktop_scene_debug.c
│   │   │   │   ├── desktop_scene_fault.c
│   │   │   │   ├── desktop_scene_hw_mismatch.c
│   │   │   │   ├── desktop_scene_lock_menu.c
│   │   │   │   ├── desktop_scene_locked.c
│   │   │   │   ├── desktop_scene_locked.h
│   │   │   │   ├── desktop_scene_main.c
│   │   │   │   ├── desktop_scene_pin_input.c
│   │   │   │   ├── desktop_scene_pin_timeout.c
│   │   │   │   ├── desktop_scene_secure_enclave.c
│   │   │   │   └── desktop_scene_slideshow.c
│   │   │   └── views/
│   │   │       ├── desktop_events.h
│   │   │       ├── desktop_view_debug.c
│   │   │       ├── desktop_view_debug.h
│   │   │       ├── desktop_view_lock_menu.c
│   │   │       ├── desktop_view_lock_menu.h
│   │   │       ├── desktop_view_locked.c
│   │   │       ├── desktop_view_locked.h
│   │   │       ├── desktop_view_main.c
│   │   │       ├── desktop_view_main.h
│   │   │       ├── desktop_view_pin_input.c
│   │   │       ├── desktop_view_pin_input.h
│   │   │       ├── desktop_view_pin_timeout.c
│   │   │       ├── desktop_view_pin_timeout.h
│   │   │       ├── desktop_view_slideshow.c
│   │   │       └── desktop_view_slideshow.h
│   │   ├── dialogs/
│   │   │   ├── application.fam
│   │   │   ├── dialogs.c
│   │   │   ├── dialogs.h
│   │   │   ├── dialogs_api.c
│   │   │   ├── dialogs_i.h
│   │   │   ├── dialogs_message.h
│   │   │   ├── dialogs_module_file_browser.c
│   │   │   ├── dialogs_module_file_browser.h
│   │   │   ├── dialogs_module_message.c
│   │   │   └── dialogs_module_message.h
│   │   ├── dolphin/
│   │   │   ├── application.fam
│   │   │   ├── dolphin.c
│   │   │   ├── dolphin.h
│   │   │   ├── dolphin_i.h
│   │   │   └── helpers/
│   │   │       ├── dolphin_deed.c
│   │   │       ├── dolphin_deed.h
│   │   │       ├── dolphin_state.c
│   │   │       ├── dolphin_state.h
│   │   │       └── dolphin_state_filename.h
│   │   ├── expansion/
│   │   │   ├── application.fam
│   │   │   ├── expansion.c
│   │   │   ├── expansion.h
│   │   │   ├── expansion_protocol.h
│   │   │   ├── expansion_settings.c
│   │   │   ├── expansion_settings.h
│   │   │   ├── expansion_settings_filename.h
│   │   │   ├── expansion_worker.c
│   │   │   └── expansion_worker.h
│   │   ├── gui/
│   │   │   ├── application.fam
│   │   │   ├── canvas.c
│   │   │   ├── canvas.h
│   │   │   ├── canvas_i.h
│   │   │   ├── elements.c
│   │   │   ├── elements.h
│   │   │   ├── gui.c
│   │   │   ├── gui.h
│   │   │   ├── gui_i.h
│   │   │   ├── icon.c
│   │   │   ├── icon.h
│   │   │   ├── icon_animation.c
│   │   │   ├── icon_animation.h
│   │   │   ├── icon_animation_i.h
│   │   │   ├── icon_i.h
│   │   │   ├── modules/
│   │   │   │   ├── button_menu.c
│   │   │   │   ├── button_menu.h
│   │   │   │   ├── button_panel.c
│   │   │   │   ├── button_panel.h
│   │   │   │   ├── byte_input.c
│   │   │   │   ├── byte_input.h
│   │   │   │   ├── dialog_ex.c
│   │   │   │   ├── dialog_ex.h
│   │   │   │   ├── empty_screen.c
│   │   │   │   ├── empty_screen.h
│   │   │   │   ├── file_browser.c
│   │   │   │   ├── file_browser.h
│   │   │   │   ├── file_browser_worker.c
│   │   │   │   ├── file_browser_worker.h
│   │   │   │   ├── loading.c
│   │   │   │   ├── loading.h
│   │   │   │   ├── menu.c
│   │   │   │   ├── menu.h
│   │   │   │   ├── number_input.c
│   │   │   │   ├── number_input.h
│   │   │   │   ├── popup.c
│   │   │   │   ├── popup.h
│   │   │   │   ├── submenu.c
│   │   │   │   ├── submenu.h
│   │   │   │   ├── text_box.c
│   │   │   │   ├── text_box.h
│   │   │   │   ├── text_input.c
│   │   │   │   ├── text_input.h
│   │   │   │   ├── validators.c
│   │   │   │   ├── validators.h
│   │   │   │   ├── variable_item_list.c
│   │   │   │   ├── variable_item_list.h
│   │   │   │   ├── widget.c
│   │   │   │   ├── widget.h
│   │   │   │   └── widget_elements/
│   │   │   │       ├── widget_element.h
│   │   │   │       ├── widget_element_button.c
│   │   │   │       ├── widget_element_circle.c
│   │   │   │       ├── widget_element_i.h
│   │   │   │       ├── widget_element_icon.c
│   │   │   │       ├── widget_element_line.c
│   │   │   │       ├── widget_element_rect.c
│   │   │   │       ├── widget_element_string.c
│   │   │   │       ├── widget_element_string_multiline.c
│   │   │   │       ├── widget_element_text_box.c
│   │   │   │       └── widget_element_text_scroll.c
│   │   │   ├── scene_manager.c
│   │   │   ├── scene_manager.h
│   │   │   ├── scene_manager_i.h
│   │   │   ├── view.c
│   │   │   ├── view.h
│   │   │   ├── view_dispatcher.c
│   │   │   ├── view_dispatcher.h
│   │   │   ├── view_dispatcher_i.h
│   │   │   ├── view_holder.c
│   │   │   ├── view_holder.h
│   │   │   ├── view_i.h
│   │   │   ├── view_port.c
│   │   │   ├── view_port.h
│   │   │   ├── view_port_i.h
│   │   │   ├── view_stack.c
│   │   │   └── view_stack.h
│   │   ├── input/
│   │   │   ├── application.fam
│   │   │   ├── input.c
│   │   │   ├── input.h
│   │   │   └── input_cli.c
│   │   ├── loader/
│   │   │   ├── application.fam
│   │   │   ├── firmware_api/
│   │   │   │   ├── firmware_api.cpp
│   │   │   │   └── firmware_api.h
│   │   │   ├── loader.c
│   │   │   ├── loader.h
│   │   │   ├── loader_applications.c
│   │   │   ├── loader_applications.h
│   │   │   ├── loader_cli.c
│   │   │   ├── loader_i.h
│   │   │   ├── loader_menu.c
│   │   │   ├── loader_menu.h
│   │   │   ├── loader_queue.c
│   │   │   └── loader_queue.h
│   │   ├── locale/
│   │   │   ├── application.fam
│   │   │   ├── locale.c
│   │   │   └── locale.h
│   │   ├── notification/
│   │   │   ├── application.fam
│   │   │   ├── notification.h
│   │   │   ├── notification_app.c
│   │   │   ├── notification_app.h
│   │   │   ├── notification_app_api.c
│   │   │   ├── notification_messages.c
│   │   │   ├── notification_messages.h
│   │   │   ├── notification_messages_notes.c
│   │   │   ├── notification_messages_notes.h
│   │   │   └── notification_settings_filename.h
│   │   ├── power/
│   │   │   ├── application.fam
│   │   │   ├── power_cli.c
│   │   │   ├── power_cli.h
│   │   │   └── power_service/
│   │   │       ├── power.c
│   │   │       ├── power.h
│   │   │       ├── power_api.c
│   │   │       ├── power_i.h
│   │   │       └── views/
│   │   │           ├── power_off.c
│   │   │           ├── power_off.h
│   │   │           ├── power_unplug_usb.c
│   │   │           └── power_unplug_usb.h
│   │   ├── region/
│   │   │   ├── application.fam
│   │   │   └── region.c
│   │   ├── rpc/
│   │   │   ├── application.fam
│   │   │   ├── rpc.c
│   │   │   ├── rpc.h
│   │   │   ├── rpc_app.c
│   │   │   ├── rpc_app.h
│   │   │   ├── rpc_app_error_codes.h
│   │   │   ├── rpc_cli.c
│   │   │   ├── rpc_debug.c
│   │   │   ├── rpc_desktop.c
│   │   │   ├── rpc_gpio.c
│   │   │   ├── rpc_gui.c
│   │   │   ├── rpc_i.h
│   │   │   ├── rpc_property.c
│   │   │   ├── rpc_storage.c
│   │   │   └── rpc_system.c
│   │   └── storage/
│   │       ├── application.fam
│   │       ├── filesystem_api.c
│   │       ├── filesystem_api_defines.h
│   │       ├── filesystem_api_internal.h
│   │       ├── storage.c
│   │       ├── storage.h
│   │       ├── storage_cli.c
│   │       ├── storage_external_api.c
│   │       ├── storage_glue.c
│   │       ├── storage_glue.h
│   │       ├── storage_i.h
│   │       ├── storage_internal_api.c
│   │       ├── storage_internal_dirname_i.h
│   │       ├── storage_message.h
│   │       ├── storage_processing.c
│   │       ├── storage_processing.h
│   │       ├── storage_sd_api.c
│   │       ├── storage_sd_api.h
│   │       └── storages/
│   │           ├── sd_notify.c
│   │           ├── sd_notify.h
│   │           ├── storage_ext.c
│   │           └── storage_ext.h
│   ├── settings/
│   │   ├── about/
│   │   │   ├── about.c
│   │   │   └── application.fam
│   │   ├── application.fam
│   │   ├── bt_settings_app/
│   │   │   ├── application.fam
│   │   │   ├── bt_settings_app.c
│   │   │   ├── bt_settings_app.h
│   │   │   └── scenes/
│   │   │       ├── bt_settings_scene.c
│   │   │       ├── bt_settings_scene.h
│   │   │       ├── bt_settings_scene_config.h
│   │   │       ├── bt_settings_scene_forget_dev_confirm.c
│   │   │       ├── bt_settings_scene_forget_dev_success.c
│   │   │       └── bt_settings_scene_start.c
│   │   ├── clock_settings/
│   │   │   ├── application.fam
│   │   │   ├── clock_settings.c
│   │   │   ├── clock_settings.h
│   │   │   ├── clock_settings_alarm.c
│   │   │   ├── scenes/
│   │   │   │   ├── clock_settings_scene.c
│   │   │   │   ├── clock_settings_scene.h
│   │   │   │   ├── clock_settings_scene_config.h
│   │   │   │   └── clock_settings_scene_start.c
│   │   │   └── views/
│   │   │       ├── clock_settings_module.c
│   │   │       └── clock_settings_module.h
│   │   ├── desktop_settings/
│   │   │   ├── application.fam
│   │   │   ├── desktop_settings_app.c
│   │   │   ├── desktop_settings_app.h
│   │   │   ├── desktop_settings_custom_event.h
│   │   │   ├── scenes/
│   │   │   │   ├── desktop_settings_scene.c
│   │   │   │   ├── desktop_settings_scene.h
│   │   │   │   ├── desktop_settings_scene_config.h
│   │   │   │   ├── desktop_settings_scene_favorite.c
│   │   │   │   ├── desktop_settings_scene_happy_mode.c
│   │   │   │   ├── desktop_settings_scene_i.h
│   │   │   │   ├── desktop_settings_scene_pin_auth.c
│   │   │   │   ├── desktop_settings_scene_pin_disable.c
│   │   │   │   ├── desktop_settings_scene_pin_error.c
│   │   │   │   ├── desktop_settings_scene_pin_menu.c
│   │   │   │   ├── desktop_settings_scene_pin_setup.c
│   │   │   │   ├── desktop_settings_scene_pin_setup_done.c
│   │   │   │   ├── desktop_settings_scene_pin_setup_howto.c
│   │   │   │   ├── desktop_settings_scene_pin_setup_howto2.c
│   │   │   │   ├── desktop_settings_scene_quick_apps_direction_menu.c
│   │   │   │   ├── desktop_settings_scene_quick_apps_menu.c
│   │   │   │   └── desktop_settings_scene_start.c
│   │   │   └── views/
│   │   │       ├── desktop_settings_view_pin_setup_howto.c
│   │   │       ├── desktop_settings_view_pin_setup_howto.h
│   │   │       ├── desktop_settings_view_pin_setup_howto2.c
│   │   │       └── desktop_settings_view_pin_setup_howto2.h
│   │   ├── dolphin_passport/
│   │   │   ├── application.fam
│   │   │   └── passport.c
│   │   ├── expansion_settings_app/
│   │   │   ├── application.fam
│   │   │   ├── expansion_settings_app.c
│   │   │   └── expansion_settings_app.h
│   │   ├── notification_settings/
│   │   │   ├── application.fam
│   │   │   └── notification_settings_app.c
│   │   ├── power_settings_app/
│   │   │   ├── application.fam
│   │   │   ├── power_settings_app.c
│   │   │   ├── power_settings_app.h
│   │   │   ├── scenes/
│   │   │   │   ├── power_settings_scene.c
│   │   │   │   ├── power_settings_scene.h
│   │   │   │   ├── power_settings_scene_battery_info.c
│   │   │   │   ├── power_settings_scene_config.h
│   │   │   │   ├── power_settings_scene_power_off.c
│   │   │   │   ├── power_settings_scene_reboot.c
│   │   │   │   ├── power_settings_scene_reboot_confirm.c
│   │   │   │   └── power_settings_scene_start.c
│   │   │   └── views/
│   │   │       ├── battery_info.c
│   │   │       └── battery_info.h
│   │   ├── storage_settings/
│   │   │   ├── application.fam
│   │   │   ├── scenes/
│   │   │   │   ├── storage_settings_scene.c
│   │   │   │   ├── storage_settings_scene.h
│   │   │   │   ├── storage_settings_scene_benchmark.c
│   │   │   │   ├── storage_settings_scene_benchmark_confirm.c
│   │   │   │   ├── storage_settings_scene_config.h
│   │   │   │   ├── storage_settings_scene_factory_reset.c
│   │   │   │   ├── storage_settings_scene_format_confirm.c
│   │   │   │   ├── storage_settings_scene_formatting.c
│   │   │   │   ├── storage_settings_scene_internal_info.c
│   │   │   │   ├── storage_settings_scene_sd_info.c
│   │   │   │   ├── storage_settings_scene_start.c
│   │   │   │   ├── storage_settings_scene_unmount_confirm.c
│   │   │   │   └── storage_settings_scene_unmounted.c
│   │   │   ├── storage_settings.c
│   │   │   └── storage_settings.h
│   │   └── system/
│   │       ├── application.fam
│   │       ├── system_settings.c
│   │       └── system_settings.h
│   └── system/
│       ├── application.fam
│       ├── hid_app/
│       │   ├── application.fam
│       │   ├── hid.c
│       │   ├── hid.h
│       │   ├── scenes/
│       │   │   ├── hid_scene.c
│       │   │   ├── hid_scene.h
│       │   │   ├── hid_scene_config.h
│       │   │   ├── hid_scene_main.c
│       │   │   ├── hid_scene_start.c
│       │   │   └── hid_scene_unpair.c
│       │   ├── transport_ble.c
│       │   ├── transport_usb.c
│       │   ├── views/
│       │   │   ├── hid_keyboard.c
│       │   │   ├── hid_keyboard.h
│       │   │   ├── hid_keynote.c
│       │   │   ├── hid_keynote.h
│       │   │   ├── hid_media.c
│       │   │   ├── hid_media.h
│       │   │   ├── hid_mouse.c
│       │   │   ├── hid_mouse.h
│       │   │   ├── hid_mouse_clicker.c
│       │   │   ├── hid_mouse_clicker.h
│       │   │   ├── hid_mouse_jiggler.c
│       │   │   ├── hid_mouse_jiggler.h
│       │   │   ├── hid_tiktok.c
│       │   │   └── hid_tiktok.h
│       │   └── views.h
│       ├── js_app/
│       │   ├── application.fam
│       │   ├── examples/
│       │   │   └── apps/
│       │   │       └── Scripts/
│       │   │           ├── array_buf_test.js
│       │   │           ├── bad_uart.js
│       │   │           ├── badusb_demo.js
│       │   │           ├── console.js
│       │   │           ├── delay.js
│       │   │           ├── event_loop.js
│       │   │           ├── gpio.js
│       │   │           ├── gui.js
│       │   │           ├── interactive.js
│       │   │           ├── load.js
│       │   │           ├── load_api.js
│       │   │           ├── math.js
│       │   │           ├── notify.js
│       │   │           ├── path.js
│       │   │           ├── storage.js
│       │   │           ├── stringutils.js
│       │   │           ├── uart_echo.js
│       │   │           └── uart_echo_8e1.js
│       │   ├── js_app.c
│       │   ├── js_app_i.h
│       │   ├── js_modules.c
│       │   ├── js_modules.h
│       │   ├── js_thread.c
│       │   ├── js_thread.h
│       │   ├── js_thread_i.h
│       │   ├── js_value.c
│       │   ├── js_value.h
│       │   ├── modules/
│       │   │   ├── js_badusb.c
│       │   │   ├── js_event_loop/
│       │   │   │   ├── js_event_loop.c
│       │   │   │   ├── js_event_loop.h
│       │   │   │   ├── js_event_loop_api_table.cpp
│       │   │   │   └── js_event_loop_api_table_i.h
│       │   │   ├── js_flipper.c
│       │   │   ├── js_flipper.h
│       │   │   ├── js_gpio.c
│       │   │   ├── js_gui/
│       │   │   │   ├── button_menu.c
│       │   │   │   ├── button_panel.c
│       │   │   │   ├── byte_input.c
│       │   │   │   ├── dialog.c
│       │   │   │   ├── empty_screen.c
│       │   │   │   ├── file_picker.c
│       │   │   │   ├── icon.c
│       │   │   │   ├── js_gui.c
│       │   │   │   ├── js_gui.h
│       │   │   │   ├── js_gui_api_table.cpp
│       │   │   │   ├── js_gui_api_table_i.h
│       │   │   │   ├── loading.c
│       │   │   │   ├── menu.c
│       │   │   │   ├── number_input.c
│       │   │   │   ├── popup.c
│       │   │   │   ├── submenu.c
│       │   │   │   ├── text_box.c
│       │   │   │   ├── text_input.c
│       │   │   │   ├── vi_list.c
│       │   │   │   └── widget.c
│       │   │   ├── js_math.c
│       │   │   ├── js_notification.c
│       │   │   ├── js_serial.c
│       │   │   ├── js_storage.c
│       │   │   ├── js_tests.c
│       │   │   └── js_tests.h
│       │   ├── packages/
│       │   │   ├── create-fz-app/
│       │   │   │   ├── README.md
│       │   │   │   ├── index.js
│       │   │   │   ├── package.json
│       │   │   │   └── template/
│       │   │   │       ├── .gitignore
│       │   │   │       ├── fz-sdk.config.json5
│       │   │   │       ├── index.ts
│       │   │   │       ├── package.json
│       │   │   │       └── tsconfig.json
│       │   │   └── fz-sdk/
│       │   │       ├── .gitignore
│       │   │       ├── README.md
│       │   │       ├── badusb/
│       │   │       │   └── index.d.ts
│       │   │       ├── docs_readme.md
│       │   │       ├── event_loop/
│       │   │       │   └── index.d.ts
│       │   │       ├── flipper/
│       │   │       │   └── index.d.ts
│       │   │       ├── global.d.ts
│       │   │       ├── gpio/
│       │   │       │   └── index.d.ts
│       │   │       ├── gui/
│       │   │       │   ├── button_menu.d.ts
│       │   │       │   ├── button_panel.d.ts
│       │   │       │   ├── byte_input.d.ts
│       │   │       │   ├── dialog.d.ts
│       │   │       │   ├── empty_screen.d.ts
│       │   │       │   ├── file_picker.d.ts
│       │   │       │   ├── icon.d.ts
│       │   │       │   ├── index.d.ts
│       │   │       │   ├── loading.d.ts
│       │   │       │   ├── menu.d.ts
│       │   │       │   ├── number_input.d.ts
│       │   │       │   ├── popup.d.ts
│       │   │       │   ├── submenu.d.ts
│       │   │       │   ├── text_box.d.ts
│       │   │       │   ├── text_input.d.ts
│       │   │       │   ├── vi_list.d.ts
│       │   │       │   └── widget.d.ts
│       │   │       ├── math/
│       │   │       │   └── index.d.ts
│       │   │       ├── notification/
│       │   │       │   └── index.d.ts
│       │   │       ├── package.json
│       │   │       ├── sdk.js
│       │   │       ├── serial/
│       │   │       │   └── index.d.ts
│       │   │       ├── storage/
│       │   │       │   └── index.d.ts
│       │   │       ├── tests/
│       │   │       │   └── index.d.ts
│       │   │       ├── tsconfig.json
│       │   │       └── typedoc.json
│       │   ├── plugin_api/
│       │   │   ├── app_api_interface.h
│       │   │   ├── app_api_table.cpp
│       │   │   └── app_api_table_i.h
│       │   └── views/
│       │       ├── console_font.h
│       │       ├── console_view.c
│       │       └── console_view.h
│       ├── snake_game/
│       │   ├── application.fam
│       │   └── snake_game.c
│       └── updater/
│           ├── application.fam
│           ├── cli/
│           │   └── updater_cli.c
│           ├── scenes/
│           │   ├── updater_scene.c
│           │   ├── updater_scene.h
│           │   ├── updater_scene_config.h
│           │   ├── updater_scene_error.c
│           │   ├── updater_scene_loadcfg.c
│           │   └── updater_scene_main.c
│           ├── updater.c
│           ├── updater_i.h
│           ├── util/
│           │   ├── update_task.c
│           │   ├── update_task.h
│           │   ├── update_task_i.h
│           │   ├── update_task_worker_backup.c
│           │   └── update_task_worker_flasher.c
│           └── views/
│               ├── updater_main.c
│               └── updater_main.h
├── assets/
│   ├── .gitignore
│   ├── ReadMe.md
│   ├── SConscript
│   ├── dolphin/
│   │   ├── ReadMe.md
│   │   ├── blocking/
│   │   │   ├── L0_NewMail_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_NoDb_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_SdBad_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_SdOk_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_Url_128x51/
│   │   │   │   └── meta.txt
│   │   │   └── manifest.txt
│   │   ├── external/
│   │   │   ├── L1_Akira_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Boxing_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Cry_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Doom_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Furippa1_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Kaiju_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Laptop_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Leaving_sad_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Mad_fist_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Mods_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_My_dude_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Painting_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Procrastinating_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Read_books_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Recording_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Sad_song_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Senpai_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Showtime_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Sleep_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Waves_128x50/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Coding_in_the_shell_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Dj_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Furippa2_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Hacking_pc_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Secret_door_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Soldering_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Wake_up_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Freedom_2_dolphins_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Furippa3_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Hijack_radio_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Intruder_alert_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Lab_research_128x54/
│   │   │   │   └── meta.txt
│   │   │   └── manifest.txt
│   │   └── internal/
│   │       ├── L1_BadBattery_128x47/
│   │       │   └── meta.txt
│   │       ├── L1_NoSd_128x49/
│   │       │   └── meta.txt
│   │       ├── L1_Tv_128x47/
│   │       │   └── meta.txt
│   │       └── manifest.txt
│   └── icons/
│       ├── Animations/
│       │   ├── Levelup1_128x64/
│       │   │   └── frame_rate
│       │   └── Levelup2_128x64/
│       │       └── frame_rate
│       ├── Common/
│       │   ├── Loading_24/
│       │   │   └── frame_rate
│       │   └── Round_loader_8x8/
│       │       └── frame_rate
│       ├── MainMenu/
│       │   ├── 125khz_14/
│       │   │   └── frame_rate
│       │   ├── BadUsb_14/
│       │   │   └── frame_rate
│       │   ├── Debug_14/
│       │   │   └── frame_rate
│       │   ├── FileManager_14/
│       │   │   └── frame_rate
│       │   ├── GPIO_14/
│       │   │   └── frame_rate
│       │   ├── Infrared_14/
│       │   │   └── frame_rate
│       │   ├── NFC_14/
│       │   │   └── frame_rate
│       │   ├── Plugins_14/
│       │   │   └── frame_rate
│       │   ├── Settings_14/
│       │   │   └── frame_rate
│       │   ├── Sub1ghz_14/
│       │   │   └── frame_rate
│       │   ├── U2F_14/
│       │   │   └── frame_rate
│       │   └── iButton_14/
│       │       └── frame_rate
│       ├── Settings/
│       │   └── Alarm_47x39/
│       │       └── frame_rate
│       └── SubGhz/
│           ├── SubGhz_External_ant/
│           │   └── frame_rate
│           └── SubGhz_Internal_ant/
│               └── frame_rate
├── documentation/
│   ├── .gitignore
│   ├── AppManifests.md
│   ├── AppsOnSDCard.md
│   ├── ExpansionModules.md
│   ├── FuriCheck.md
│   ├── FuriHalBus.md
│   ├── FuriHalDebugging.md
│   ├── HardwareTargets.md
│   ├── KeyCombo.md
│   ├── LFRFIDRaw.md
│   ├── OTA.md
│   ├── UnitTests.md
│   ├── UniversalRemotes.md
│   ├── devboard/
│   │   ├── Debugging via the Devboard.md
│   │   ├── Devboard debug modes.md
│   │   ├── Firmware update on Developer Board.md
│   │   ├── Get started with the Dev Board.md
│   │   ├── Reading logs via the Dev Board.md
│   │   ├── USB connection to the Devboard.md
│   │   └── Wi-Fi connection to the Devboard.md
│   ├── doxygen/
│   │   ├── Doxyfile-awesome.cfg
│   │   ├── Doxyfile.cfg
│   │   ├── app_publishing.dox
│   │   ├── applications.dox
│   │   ├── dev_board.dox
│   │   ├── dev_tools.dox
│   │   ├── examples.dox
│   │   ├── expansion_modules.dox
│   │   ├── file_formats.dox
│   │   ├── header.html
│   │   ├── index.dox
│   │   ├── js.dox
│   │   ├── misc.dox
│   │   └── system.dox
│   ├── fbt.md
│   ├── file_formats/
│   │   ├── BadUsbScriptFormat.md
│   │   ├── InfraredFileFormats.md
│   │   ├── LfRfidFileFormat.md
│   │   ├── NfcFileFormats.md
│   │   ├── SubGhzFileFormats.md
│   │   ├── TarHeatshrinkFormat.md
│   │   └── iButtonFileFormat.md
│   └── js/
│       ├── js_about.md
│       ├── js_badusb.md
│       ├── js_builtin.md
│       ├── js_data_types.md
│       ├── js_developing_apps_using_js_sdk.md
│       ├── js_event_loop.md
│       ├── js_flipper.md
│       ├── js_gpio.md
│       ├── js_gui.md
│       ├── js_gui__byte_input.md
│       ├── js_gui__dialog.md
│       ├── js_gui__empty_screen.md
│       ├── js_gui__file_picker.md
│       ├── js_gui__icon.md
│       ├── js_gui__loading.md
│       ├── js_gui__submenu.md
│       ├── js_gui__text_box.md
│       ├── js_gui__text_input.md
│       ├── js_gui__widget.md
│       ├── js_math.md
│       ├── js_notification.md
│       ├── js_serial.md
│       ├── js_storage.md
│       ├── js_using_js_modules.md
│       └── js_your_first_js_app.md
├── fbt
├── fbt.cmd
├── fbt_options.py
├── firmware.scons
├── furi/
│   ├── SConscript
│   ├── core/
│   │   ├── base.h
│   │   ├── check.c
│   │   ├── check.h
│   │   ├── common_defines.h
│   │   ├── core_defines.h
│   │   ├── critical.c
│   │   ├── dangerous_defines.h
│   │   ├── event_flag.c
│   │   ├── event_flag.h
│   │   ├── event_loop.c
│   │   ├── event_loop.h
│   │   ├── event_loop_i.h
│   │   ├── event_loop_link_i.h
│   │   ├── event_loop_thread_flag_interface.h
│   │   ├── event_loop_tick.c
│   │   ├── event_loop_tick_i.h
│   │   ├── event_loop_timer.c
│   │   ├── event_loop_timer.h
│   │   ├── event_loop_timer_i.h
│   │   ├── kernel.c
│   │   ├── kernel.h
│   │   ├── log.c
│   │   ├── log.h
│   │   ├── memmgr.c
│   │   ├── memmgr.h
│   │   ├── memmgr_heap.c
│   │   ├── memmgr_heap.h
│   │   ├── message_queue.c
│   │   ├── message_queue.h
│   │   ├── mutex.c
│   │   ├── mutex.h
│   │   ├── pubsub.c
│   │   ├── pubsub.h
│   │   ├── record.c
│   │   ├── record.h
│   │   ├── semaphore.c
│   │   ├── semaphore.h
│   │   ├── stream_buffer.c
│   │   ├── stream_buffer.h
│   │   ├── string.c
│   │   ├── string.h
│   │   ├── thread.c
│   │   ├── thread.h
│   │   ├── thread_i.h
│   │   ├── thread_list.c
│   │   ├── thread_list.h
│   │   ├── thread_list_i.h
│   │   ├── timer.c
│   │   └── timer.h
│   ├── flipper.c
│   ├── flipper.h
│   ├── furi.c
│   └── furi.h
├── lib/
│   ├── FreeRTOS-glue/
│   │   └── task_control_block.h
│   ├── ReadMe.md
│   ├── SConscript
│   ├── bit_lib/
│   │   ├── SConscript
│   │   ├── bit_lib.c
│   │   └── bit_lib.h
│   ├── ble_profile/
│   │   ├── SConscript
│   │   ├── extra_profiles/
│   │   │   ├── hid_profile.c
│   │   │   └── hid_profile.h
│   │   └── extra_services/
│   │       ├── hid_service.c
│   │       └── hid_service.h
│   ├── cmsis_core/
│   │   ├── cmsis_armcc.h
│   │   ├── cmsis_armclang.h
│   │   ├── cmsis_armclang_ltm.h
│   │   ├── cmsis_compiler.h
│   │   ├── cmsis_gcc.h
│   │   ├── cmsis_iccarm.h
│   │   ├── cmsis_tiarmclang.h
│   │   ├── cmsis_version.h
│   │   ├── core_cm4.h
│   │   └── mpu_armv7.h
│   ├── datetime/
│   │   ├── SConscript
│   │   ├── datetime.c
│   │   └── datetime.h
│   ├── digital_signal/
│   │   ├── SConscript
│   │   ├── digital_sequence.c
│   │   ├── digital_sequence.h
│   │   ├── digital_signal.c
│   │   ├── digital_signal.h
│   │   ├── digital_signal_i.h
│   │   └── presets/
│   │       └── nfc/
│   │           ├── iso14443_3a_signal.c
│   │           ├── iso14443_3a_signal.h
│   │           ├── iso15693_signal.c
│   │           └── iso15693_signal.h
│   ├── drivers/
│   │   ├── SConscript
│   │   ├── bq25896.c
│   │   ├── bq25896.h
│   │   ├── bq25896_reg.h
│   │   ├── bq27220.c
│   │   ├── bq27220.h
│   │   ├── bq27220_data_memory.h
│   │   ├── bq27220_reg.h
│   │   ├── cc1101.c
│   │   ├── cc1101.h
│   │   ├── cc1101_regs.h
│   │   ├── lp5562.c
│   │   ├── lp5562.h
│   │   ├── lp5562_reg.h
│   │   ├── st25r3916.c
│   │   ├── st25r3916.h
│   │   ├── st25r3916_reg.c
│   │   └── st25r3916_reg.h
│   ├── err.h
│   ├── fatfs/
│   │   ├── SConscript
│   │   ├── diskio.c
│   │   ├── diskio.h
│   │   ├── ff.c
│   │   ├── ff.h
│   │   ├── ff_gen_drv.c
│   │   ├── ff_gen_drv.h
│   │   ├── ffconf_template.h
│   │   ├── integer.h
│   │   └── option/
│   │       ├── cc932.c
│   │       ├── cc936.c
│   │       ├── cc949.c
│   │       ├── cc950.c
│   │       ├── ccsbcs.c
│   │       └── unicode.c
│   ├── flipper_application/
│   │   ├── SConscript
│   │   ├── api_hashtable/
│   │   │   ├── api_hashtable.cpp
│   │   │   ├── api_hashtable.h
│   │   │   └── compilesort.hpp
│   │   ├── application_assets.c
│   │   ├── application_assets.h
│   │   ├── application_manifest.c
│   │   ├── application_manifest.h
│   │   ├── elf/
│   │   │   ├── elf.h
│   │   │   ├── elf_api_interface.h
│   │   │   ├── elf_file.c
│   │   │   ├── elf_file.h
│   │   │   └── elf_file_i.h
│   │   ├── flipper_application.c
│   │   ├── flipper_application.h
│   │   └── plugins/
│   │       ├── composite_resolver.c
│   │       ├── composite_resolver.h
│   │       ├── plugin_manager.c
│   │       └── plugin_manager.h
│   ├── flipper_format/
│   │   ├── SConscript
│   │   ├── flipper_format.c
│   │   ├── flipper_format.h
│   │   ├── flipper_format_i.h
│   │   ├── flipper_format_stream.c
│   │   ├── flipper_format_stream.h
│   │   └── flipper_format_stream_i.h
│   ├── freertos.scons
│   ├── heatshrink.scons
│   ├── ibutton/
│   │   ├── SConscript
│   │   ├── ibutton_key.c
│   │   ├── ibutton_key.h
│   │   ├── ibutton_key_i.h
│   │   ├── ibutton_protocols.c
│   │   ├── ibutton_protocols.h
│   │   ├── ibutton_worker.c
│   │   ├── ibutton_worker.h
│   │   ├── ibutton_worker_i.h
│   │   ├── ibutton_worker_modes.c
│   │   └── protocols/
│   │       ├── blanks/
│   │       │   ├── rw1990.c
│   │       │   ├── rw1990.h
│   │       │   ├── tm01x.c
│   │       │   ├── tm01x.h
│   │       │   ├── tm2004.c
│   │       │   └── tm2004.h
│   │       ├── dallas/
│   │       │   ├── dallas_common.c
│   │       │   ├── dallas_common.h
│   │       │   ├── protocol_dallas_base.h
│   │       │   ├── protocol_ds1971.c
│   │       │   ├── protocol_ds1971.h
│   │       │   ├── protocol_ds1990.c
│   │       │   ├── protocol_ds1990.h
│   │       │   ├── protocol_ds1992.c
│   │       │   ├── protocol_ds1992.h
│   │       │   ├── protocol_ds1996.c
│   │       │   ├── protocol_ds1996.h
│   │       │   ├── protocol_ds_generic.c
│   │       │   ├── protocol_ds_generic.h
│   │       │   ├── protocol_group_dallas.c
│   │       │   ├── protocol_group_dallas.h
│   │       │   ├── protocol_group_dallas_defs.c
│   │       │   └── protocol_group_dallas_defs.h
│   │       ├── misc/
│   │       │   ├── protocol_cyfral.c
│   │       │   ├── protocol_cyfral.h
│   │       │   ├── protocol_group_misc.c
│   │       │   ├── protocol_group_misc.h
│   │       │   ├── protocol_group_misc_defs.c
│   │       │   ├── protocol_group_misc_defs.h
│   │       │   ├── protocol_metakom.c
│   │       │   └── protocol_metakom.h
│   │       ├── protocol_common.h
│   │       ├── protocol_common_i.h
│   │       ├── protocol_group_base.h
│   │       ├── protocol_group_defs.c
│   │       └── protocol_group_defs.h
│   ├── ieee754_parse_wrap/
│   │   ├── SConscript
│   │   ├── wrappers.c
│   │   └── wrappers.h
│   ├── infrared/
│   │   ├── SConscript
│   │   ├── encoder_decoder/
│   │   │   ├── common/
│   │   │   │   ├── infrared_common_decoder.c
│   │   │   │   ├── infrared_common_encoder.c
│   │   │   │   └── infrared_common_i.h
│   │   │   ├── infrared.c
│   │   │   ├── infrared.h
│   │   │   ├── infrared_i.h
│   │   │   ├── kaseikyo/
│   │   │   │   ├── infrared_decoder_kaseikyo.c
│   │   │   │   ├── infrared_encoder_kaseikyo.c
│   │   │   │   ├── infrared_protocol_kaseikyo.c
│   │   │   │   ├── infrared_protocol_kaseikyo.h
│   │   │   │   └── infrared_protocol_kaseikyo_i.h
│   │   │   ├── nec/
│   │   │   │   ├── infrared_decoder_nec.c
│   │   │   │   ├── infrared_encoder_nec.c
│   │   │   │   ├── infrared_protocol_nec.c
│   │   │   │   ├── infrared_protocol_nec.h
│   │   │   │   └── infrared_protocol_nec_i.h
│   │   │   ├── pioneer/
│   │   │   │   ├── infrared_decoder_pioneer.c
│   │   │   │   ├── infrared_encoder_pioneer.c
│   │   │   │   ├── infrared_protocol_pioneer.c
│   │   │   │   ├── infrared_protocol_pioneer.h
│   │   │   │   └── infrared_protocol_pioneer_i.h
│   │   │   ├── rc5/
│   │   │   │   ├── infrared_decoder_rc5.c
│   │   │   │   ├── infrared_encoder_rc5.c
│   │   │   │   ├── infrared_protocol_rc5.c
│   │   │   │   ├── infrared_protocol_rc5.h
│   │   │   │   └── infrared_protocol_rc5_i.h
│   │   │   ├── rc6/
│   │   │   │   ├── infrared_decoder_rc6.c
│   │   │   │   ├── infrared_encoder_rc6.c
│   │   │   │   ├── infrared_protocol_rc6.c
│   │   │   │   ├── infrared_protocol_rc6.h
│   │   │   │   └── infrared_protocol_rc6_i.h
│   │   │   ├── rca/
│   │   │   │   ├── infrared_decoder_rca.c
│   │   │   │   ├── infrared_encoder_rca.c
│   │   │   │   ├── infrared_protocol_rca.c
│   │   │   │   ├── infrared_protocol_rca.h
│   │   │   │   └── infrared_protocol_rca_i.h
│   │   │   ├── samsung/
│   │   │   │   ├── infrared_decoder_samsung.c
│   │   │   │   ├── infrared_encoder_samsung.c
│   │   │   │   ├── infrared_protocol_samsung.c
│   │   │   │   ├── infrared_protocol_samsung.h
│   │   │   │   └── infrared_protocol_samsung_i.h
│   │   │   └── sirc/
│   │   │       ├── infrared_decoder_sirc.c
│   │   │       ├── infrared_encoder_sirc.c
│   │   │       ├── infrared_protocol_sirc.c
│   │   │       ├── infrared_protocol_sirc.h
│   │   │       └── infrared_protocol_sirc_i.h
│   │   ├── signal/
│   │   │   ├── infrared_brute_force.c
│   │   │   ├── infrared_brute_force.h
│   │   │   ├── infrared_error_code.h
│   │   │   ├── infrared_signal.c
│   │   │   └── infrared_signal.h
│   │   └── worker/
│   │       ├── infrared_transmit.c
│   │       ├── infrared_transmit.h
│   │       ├── infrared_worker.c
│   │       └── infrared_worker.h
│   ├── lfrfid/
│   │   ├── SConscript
│   │   ├── lfrfid_dict_file.c
│   │   ├── lfrfid_dict_file.h
│   │   ├── lfrfid_raw_file.c
│   │   ├── lfrfid_raw_file.h
│   │   ├── lfrfid_raw_worker.c
│   │   ├── lfrfid_raw_worker.h
│   │   ├── lfrfid_worker.c
│   │   ├── lfrfid_worker.h
│   │   ├── lfrfid_worker_i.h
│   │   ├── lfrfid_worker_modes.c
│   │   ├── protocols/
│   │   │   ├── lfrfid_protocols.c
│   │   │   ├── lfrfid_protocols.h
│   │   │   ├── protocol_awid.c
│   │   │   ├── protocol_awid.h
│   │   │   ├── protocol_electra.c
│   │   │   ├── protocol_electra.h
│   │   │   ├── protocol_em4100.c
│   │   │   ├── protocol_em4100.h
│   │   │   ├── protocol_fdx_a.c
│   │   │   ├── protocol_fdx_a.h
│   │   │   ├── protocol_fdx_b.c
│   │   │   ├── protocol_fdx_b.h
│   │   │   ├── protocol_gallagher.c
│   │   │   ├── protocol_gallagher.h
│   │   │   ├── protocol_gproxii.c
│   │   │   ├── protocol_gproxii.h
│   │   │   ├── protocol_h10301.c
│   │   │   ├── protocol_h10301.h
│   │   │   ├── protocol_hid_ex_generic.c
│   │   │   ├── protocol_hid_ex_generic.h
│   │   │   ├── protocol_hid_generic.c
│   │   │   ├── protocol_hid_generic.h
│   │   │   ├── protocol_idteck.c
│   │   │   ├── protocol_idteck.h
│   │   │   ├── protocol_indala26.c
│   │   │   ├── protocol_indala26.h
│   │   │   ├── protocol_io_prox_xsf.c
│   │   │   ├── protocol_io_prox_xsf.h
│   │   │   ├── protocol_jablotron.c
│   │   │   ├── protocol_jablotron.h
│   │   │   ├── protocol_keri.c
│   │   │   ├── protocol_keri.h
│   │   │   ├── protocol_nexwatch.c
│   │   │   ├── protocol_nexwatch.h
│   │   │   ├── protocol_noralsy.c
│   │   │   ├── protocol_noralsy.h
│   │   │   ├── protocol_pac_stanley.c
│   │   │   ├── protocol_pac_stanley.h
│   │   │   ├── protocol_paradox.c
│   │   │   ├── protocol_paradox.h
│   │   │   ├── protocol_pyramid.c
│   │   │   ├── protocol_pyramid.h
│   │   │   ├── protocol_securakey.c
│   │   │   ├── protocol_securakey.h
│   │   │   ├── protocol_viking.c
│   │   │   └── protocol_viking.h
│   │   └── tools/
│   │       ├── em4305.c
│   │       ├── em4305.h
│   │       ├── fsk_demod.c
│   │       ├── fsk_demod.h
│   │       ├── fsk_ocs.c
│   │       ├── fsk_osc.h
│   │       ├── iso_3166.c
│   │       ├── iso_3166.h
│   │       ├── t5577.c
│   │       ├── t5577.h
│   │       ├── varint_pair.c
│   │       └── varint_pair.h
│   ├── libusb_stm32.scons
│   ├── mbedtls.scons
│   ├── mbedtls_cfg.h
│   ├── microtar.scons
│   ├── mjs/
│   │   ├── SConscript
│   │   ├── common/
│   │   │   ├── cs_dbg.c
│   │   │   ├── cs_dbg.h
│   │   │   ├── cs_dirent.c
│   │   │   ├── cs_dirent.h
│   │   │   ├── cs_file.c
│   │   │   ├── cs_file.h
│   │   │   ├── cs_time.c
│   │   │   ├── cs_time.h
│   │   │   ├── cs_varint.c
│   │   │   ├── cs_varint.h
│   │   │   ├── frozen/
│   │   │   │   ├── frozen.c
│   │   │   │   └── frozen.h
│   │   │   ├── mbuf.c
│   │   │   ├── mbuf.h
│   │   │   ├── mg_mem.h
│   │   │   ├── mg_str.c
│   │   │   ├── mg_str.h
│   │   │   ├── platform.h
│   │   │   ├── platforms/
│   │   │   │   ├── platform_flipper.c
│   │   │   │   └── platform_flipper.h
│   │   │   ├── str_util.c
│   │   │   └── str_util.h
│   │   ├── ffi/
│   │   │   ├── ffi.c
│   │   │   └── ffi.h
│   │   ├── mjs_array.c
│   │   ├── mjs_array.h
│   │   ├── mjs_array_buf.c
│   │   ├── mjs_array_buf.h
│   │   ├── mjs_array_buf_public.h
│   │   ├── mjs_array_public.h
│   │   ├── mjs_bcode.c
│   │   ├── mjs_bcode.h
│   │   ├── mjs_builtin.c
│   │   ├── mjs_builtin.h
│   │   ├── mjs_core.c
│   │   ├── mjs_core.h
│   │   ├── mjs_core_public.h
│   │   ├── mjs_dataview.c
│   │   ├── mjs_dataview.h
│   │   ├── mjs_exec.c
│   │   ├── mjs_exec.h
│   │   ├── mjs_exec_public.h
│   │   ├── mjs_features.h
│   │   ├── mjs_ffi.c
│   │   ├── mjs_ffi.h
│   │   ├── mjs_ffi_public.h
│   │   ├── mjs_gc.c
│   │   ├── mjs_gc.h
│   │   ├── mjs_gc_public.h
│   │   ├── mjs_internal.h
│   │   ├── mjs_json.c
│   │   ├── mjs_json.h
│   │   ├── mjs_license.h
│   │   ├── mjs_mm.h
│   │   ├── mjs_object.c
│   │   ├── mjs_object.h
│   │   ├── mjs_object_public.h
│   │   ├── mjs_parser.c
│   │   ├── mjs_parser.h
│   │   ├── mjs_primitive.c
│   │   ├── mjs_primitive.h
│   │   ├── mjs_primitive_public.h
│   │   ├── mjs_string.c
│   │   ├── mjs_string.h
│   │   ├── mjs_string_public.h
│   │   ├── mjs_tok.c
│   │   ├── mjs_tok.h
│   │   ├── mjs_util.c
│   │   ├── mjs_util.h
│   │   └── mjs_util_public.h
│   ├── mlib.scons
│   ├── music_worker/
│   │   ├── SConscript
│   │   ├── music_worker.c
│   │   └── music_worker.h
│   ├── nanopb.scons
│   ├── nfc/
│   │   ├── SConscript
│   │   ├── helpers/
│   │   │   ├── crypto1.c
│   │   │   ├── crypto1.h
│   │   │   ├── felica_crc.c
│   │   │   ├── felica_crc.h
│   │   │   ├── iso13239_crc.c
│   │   │   ├── iso13239_crc.h
│   │   │   ├── iso14443_4_layer.c
│   │   │   ├── iso14443_4_layer.h
│   │   │   ├── iso14443_crc.c
│   │   │   ├── iso14443_crc.h
│   │   │   ├── nfc_data_generator.c
│   │   │   ├── nfc_data_generator.h
│   │   │   ├── nfc_util.c
│   │   │   └── nfc_util.h
│   │   ├── nfc.c
│   │   ├── nfc.h
│   │   ├── nfc_common.h
│   │   ├── nfc_device.c
│   │   ├── nfc_device.h
│   │   ├── nfc_device_i.c
│   │   ├── nfc_device_i.h
│   │   ├── nfc_listener.c
│   │   ├── nfc_listener.h
│   │   ├── nfc_mock.c
│   │   ├── nfc_poller.c
│   │   ├── nfc_poller.h
│   │   ├── nfc_scanner.c
│   │   ├── nfc_scanner.h
│   │   └── protocols/
│   │       ├── felica/
│   │       │   ├── felica.c
│   │       │   ├── felica.h
│   │       │   ├── felica_i.c
│   │       │   ├── felica_i.h
│   │       │   ├── felica_listener.c
│   │       │   ├── felica_listener.h
│   │       │   ├── felica_listener_defs.h
│   │       │   ├── felica_listener_i.c
│   │       │   ├── felica_listener_i.h
│   │       │   ├── felica_poller.c
│   │       │   ├── felica_poller.h
│   │       │   ├── felica_poller_defs.h
│   │       │   ├── felica_poller_i.c
│   │       │   ├── felica_poller_i.h
│   │       │   ├── felica_poller_sync.c
│   │       │   └── felica_poller_sync.h
│   │       ├── iso14443_3a/
│   │       │   ├── iso14443_3a.c
│   │       │   ├── iso14443_3a.h
│   │       │   ├── iso14443_3a_device_defs.h
│   │       │   ├── iso14443_3a_listener.c
│   │       │   ├── iso14443_3a_listener.h
│   │       │   ├── iso14443_3a_listener_defs.h
│   │       │   ├── iso14443_3a_listener_i.c
│   │       │   ├── iso14443_3a_listener_i.h
│   │       │   ├── iso14443_3a_poller.c
│   │       │   ├── iso14443_3a_poller.h
│   │       │   ├── iso14443_3a_poller_defs.h
│   │       │   ├── iso14443_3a_poller_i.c
│   │       │   ├── iso14443_3a_poller_i.h
│   │       │   ├── iso14443_3a_poller_sync.c
│   │       │   └── iso14443_3a_poller_sync.h
│   │       ├── iso14443_3b/
│   │       │   ├── iso14443_3b.c
│   │       │   ├── iso14443_3b.h
│   │       │   ├── iso14443_3b_device_defs.h
│   │       │   ├── iso14443_3b_i.h
│   │       │   ├── iso14443_3b_poller.c
│   │       │   ├── iso14443_3b_poller.h
│   │       │   ├── iso14443_3b_poller_defs.h
│   │       │   ├── iso14443_3b_poller_i.c
│   │       │   └── iso14443_3b_poller_i.h
│   │       ├── iso14443_4a/
│   │       │   ├── iso14443_4a.c
│   │       │   ├── iso14443_4a.h
│   │       │   ├── iso14443_4a_device_defs.h
│   │       │   ├── iso14443_4a_i.c
│   │       │   ├── iso14443_4a_i.h
│   │       │   ├── iso14443_4a_listener.c
│   │       │   ├── iso14443_4a_listener.h
│   │       │   ├── iso14443_4a_listener_defs.h
│   │       │   ├── iso14443_4a_listener_i.c
│   │       │   ├── iso14443_4a_listener_i.h
│   │       │   ├── iso14443_4a_poller.c
│   │       │   ├── iso14443_4a_poller.h
│   │       │   ├── iso14443_4a_poller_defs.h
│   │       │   ├── iso14443_4a_poller_i.c
│   │       │   └── iso14443_4a_poller_i.h
│   │       ├── iso14443_4b/
│   │       │   ├── iso14443_4b.c
│   │       │   ├── iso14443_4b.h
│   │       │   ├── iso14443_4b_device_defs.h
│   │       │   ├── iso14443_4b_i.c
│   │       │   ├── iso14443_4b_i.h
│   │       │   ├── iso14443_4b_poller.c
│   │       │   ├── iso14443_4b_poller.h
│   │       │   ├── iso14443_4b_poller_defs.h
│   │       │   ├── iso14443_4b_poller_i.c
│   │       │   └── iso14443_4b_poller_i.h
│   │       ├── iso15693_3/
│   │       │   ├── iso15693_3.c
│   │       │   ├── iso15693_3.h
│   │       │   ├── iso15693_3_device_defs.h
│   │       │   ├── iso15693_3_i.c
│   │       │   ├── iso15693_3_i.h
│   │       │   ├── iso15693_3_listener.c
│   │       │   ├── iso15693_3_listener.h
│   │       │   ├── iso15693_3_listener_defs.h
│   │       │   ├── iso15693_3_listener_i.c
│   │       │   ├── iso15693_3_listener_i.h
│   │       │   ├── iso15693_3_poller.c
│   │       │   ├── iso15693_3_poller.h
│   │       │   ├── iso15693_3_poller_defs.h
│   │       │   ├── iso15693_3_poller_i.c
│   │       │   └── iso15693_3_poller_i.h
│   │       ├── mf_classic/
│   │       │   ├── mf_classic.c
│   │       │   ├── mf_classic.h
│   │       │   ├── mf_classic_listener.c
│   │       │   ├── mf_classic_listener.h
│   │       │   ├── mf_classic_listener_defs.h
│   │       │   ├── mf_classic_listener_i.h
│   │       │   ├── mf_classic_poller.c
│   │       │   ├── mf_classic_poller.h
│   │       │   ├── mf_classic_poller_defs.h
│   │       │   ├── mf_classic_poller_i.c
│   │       │   ├── mf_classic_poller_i.h
│   │       │   ├── mf_classic_poller_sync.c
│   │       │   └── mf_classic_poller_sync.h
│   │       ├── mf_desfire/
│   │       │   ├── mf_desfire.c
│   │       │   ├── mf_desfire.h
│   │       │   ├── mf_desfire_i.c
│   │       │   ├── mf_desfire_i.h
│   │       │   ├── mf_desfire_poller.c
│   │       │   ├── mf_desfire_poller.h
│   │       │   ├── mf_desfire_poller_defs.h
│   │       │   ├── mf_desfire_poller_i.c
│   │       │   └── mf_desfire_poller_i.h
│   │       ├── mf_plus/
│   │       │   ├── mf_plus.c
│   │       │   ├── mf_plus.h
│   │       │   ├── mf_plus_i.c
│   │       │   ├── mf_plus_i.h
│   │       │   ├── mf_plus_poller.c
│   │       │   ├── mf_plus_poller.h
│   │       │   ├── mf_plus_poller_defs.h
│   │       │   ├── mf_plus_poller_i.c
│   │       │   └── mf_plus_poller_i.h
│   │       ├── mf_ultralight/
│   │       │   ├── mf_ultralight.c
│   │       │   ├── mf_ultralight.h
│   │       │   ├── mf_ultralight_listener.c
│   │       │   ├── mf_ultralight_listener.h
│   │       │   ├── mf_ultralight_listener_defs.h
│   │       │   ├── mf_ultralight_listener_i.c
│   │       │   ├── mf_ultralight_listener_i.h
│   │       │   ├── mf_ultralight_poller.c
│   │       │   ├── mf_ultralight_poller.h
│   │       │   ├── mf_ultralight_poller_defs.h
│   │       │   ├── mf_ultralight_poller_i.c
│   │       │   ├── mf_ultralight_poller_i.h
│   │       │   ├── mf_ultralight_poller_sync.c
│   │       │   └── mf_ultralight_poller_sync.h
│   │       ├── nfc_device_base.h
│   │       ├── nfc_device_base_i.h
│   │       ├── nfc_device_defs.c
│   │       ├── nfc_device_defs.h
│   │       ├── nfc_generic_event.h
│   │       ├── nfc_listener_base.h
│   │       ├── nfc_listener_defs.c
│   │       ├── nfc_listener_defs.h
│   │       ├── nfc_poller_base.h
│   │       ├── nfc_poller_defs.c
│   │       ├── nfc_poller_defs.h
│   │       ├── nfc_protocol.c
│   │       ├── nfc_protocol.h
│   │       ├── slix/
│   │       │   ├── slix.c
│   │       │   ├── slix.h
│   │       │   ├── slix_device_defs.h
│   │       │   ├── slix_i.c
│   │       │   ├── slix_i.h
│   │       │   ├── slix_listener.c
│   │       │   ├── slix_listener.h
│   │       │   ├── slix_listener_defs.h
│   │       │   ├── slix_listener_i.c
│   │       │   ├── slix_listener_i.h
│   │       │   ├── slix_poller.c
│   │       │   ├── slix_poller.h
│   │       │   ├── slix_poller_defs.h
│   │       │   ├── slix_poller_i.c
│   │       │   └── slix_poller_i.h
│   │       └── st25tb/
│   │           ├── st25tb.c
│   │           ├── st25tb.h
│   │           ├── st25tb_poller.c
│   │           ├── st25tb_poller.h
│   │           ├── st25tb_poller_defs.h
│   │           ├── st25tb_poller_i.c
│   │           ├── st25tb_poller_i.h
│   │           ├── st25tb_poller_sync.c
│   │           └── st25tb_poller_sync.h
│   ├── one_wire/
│   │   ├── SConscript
│   │   ├── maxim_crc.c
│   │   ├── maxim_crc.h
│   │   ├── one_wire_host.c
│   │   ├── one_wire_host.h
│   │   ├── one_wire_slave.c
│   │   └── one_wire_slave.h
│   ├── print/
│   │   ├── SConscript
│   │   ├── printf_tiny.c
│   │   ├── printf_tiny.h
│   │   ├── wrappers.c
│   │   └── wrappers.h
│   ├── pulse_reader/
│   │   ├── SConscript
│   │   ├── pulse_reader.c
│   │   └── pulse_reader.h
│   ├── signal_reader/
│   │   ├── SConscript
│   │   ├── parsers/
│   │   │   └── iso15693/
│   │   │       ├── iso15693_parser.c
│   │   │       └── iso15693_parser.h
│   │   ├── signal_reader.c
│   │   └── signal_reader.h
│   ├── stm32wb.scons
│   ├── subghz/
│   │   ├── SConscript
│   │   ├── blocks/
│   │   │   ├── const.h
│   │   │   ├── decoder.c
│   │   │   ├── decoder.h
│   │   │   ├── encoder.c
│   │   │   ├── encoder.h
│   │   │   ├── generic.c
│   │   │   ├── generic.h
│   │   │   ├── math.c
│   │   │   └── math.h
│   │   ├── devices/
│   │   │   ├── cc1101_configs.c
│   │   │   ├── cc1101_configs.h
│   │   │   ├── cc1101_int/
│   │   │   │   ├── cc1101_int_interconnect.c
│   │   │   │   └── cc1101_int_interconnect.h
│   │   │   ├── device_registry.h
│   │   │   ├── devices.c
│   │   │   ├── devices.h
│   │   │   ├── preset.h
│   │   │   ├── registry.c
│   │   │   ├── registry.h
│   │   │   └── types.h
│   │   ├── environment.c
│   │   ├── environment.h
│   │   ├── protocols/
│   │   │   ├── alutech_at_4n.c
│   │   │   ├── alutech_at_4n.h
│   │   │   ├── ansonic.c
│   │   │   ├── ansonic.h
│   │   │   ├── base.c
│   │   │   ├── base.h
│   │   │   ├── bett.c
│   │   │   ├── bett.h
│   │   │   ├── bin_raw.c
│   │   │   ├── bin_raw.h
│   │   │   ├── came.c
│   │   │   ├── came.h
│   │   │   ├── came_atomo.c
│   │   │   ├── came_atomo.h
│   │   │   ├── came_twee.c
│   │   │   ├── came_twee.h
│   │   │   ├── chamberlain_code.c
│   │   │   ├── chamberlain_code.h
│   │   │   ├── clemsa.c
│   │   │   ├── clemsa.h
│   │   │   ├── dickert_mahs.c
│   │   │   ├── dickert_mahs.h
│   │   │   ├── doitrand.c
│   │   │   ├── doitrand.h
│   │   │   ├── dooya.c
│   │   │   ├── dooya.h
│   │   │   ├── faac_slh.c
│   │   │   ├── faac_slh.h
│   │   │   ├── feron.c
│   │   │   ├── feron.h
│   │   │   ├── gangqi.c
│   │   │   ├── gangqi.h
│   │   │   ├── gate_tx.c
│   │   │   ├── gate_tx.h
│   │   │   ├── hay21.c
│   │   │   ├── hay21.h
│   │   │   ├── hollarm.c
│   │   │   ├── hollarm.h
│   │   │   ├── holtek.c
│   │   │   ├── holtek.h
│   │   │   ├── holtek_ht12x.c
│   │   │   ├── holtek_ht12x.h
│   │   │   ├── honeywell_wdb.c
│   │   │   ├── honeywell_wdb.h
│   │   │   ├── hormann.c
│   │   │   ├── hormann.h
│   │   │   ├── ido.c
│   │   │   ├── ido.h
│   │   │   ├── intertechno_v3.c
│   │   │   ├── intertechno_v3.h
│   │   │   ├── keeloq.c
│   │   │   ├── keeloq.h
│   │   │   ├── keeloq_common.c
│   │   │   ├── keeloq_common.h
│   │   │   ├── kia.c
│   │   │   ├── kia.h
│   │   │   ├── kinggates_stylo_4k.c
│   │   │   ├── kinggates_stylo_4k.h
│   │   │   ├── legrand.c
│   │   │   ├── legrand.h
│   │   │   ├── linear.c
│   │   │   ├── linear.h
│   │   │   ├── linear_delta3.c
│   │   │   ├── linear_delta3.h
│   │   │   ├── magellan.c
│   │   │   ├── magellan.h
│   │   │   ├── marantec.c
│   │   │   ├── marantec.h
│   │   │   ├── marantec24.c
│   │   │   ├── marantec24.h
│   │   │   ├── mastercode.c
│   │   │   ├── mastercode.h
│   │   │   ├── megacode.c
│   │   │   ├── megacode.h
│   │   │   ├── nero_radio.c
│   │   │   ├── nero_radio.h
│   │   │   ├── nero_sketch.c
│   │   │   ├── nero_sketch.h
│   │   │   ├── nice_flo.c
│   │   │   ├── nice_flo.h
│   │   │   ├── nice_flor_s.c
│   │   │   ├── nice_flor_s.h
│   │   │   ├── phoenix_v2.c
│   │   │   ├── phoenix_v2.h
│   │   │   ├── power_smart.c
│   │   │   ├── power_smart.h
│   │   │   ├── princeton.c
│   │   │   ├── princeton.h
│   │   │   ├── protocol_items.c
│   │   │   ├── protocol_items.h
│   │   │   ├── public_api.h
│   │   │   ├── raw.c
│   │   │   ├── raw.h
│   │   │   ├── revers_rb2.c
│   │   │   ├── revers_rb2.h
│   │   │   ├── roger.c
│   │   │   ├── roger.h
│   │   │   ├── scher_khan.c
│   │   │   ├── scher_khan.h
│   │   │   ├── secplus_v1.c
│   │   │   ├── secplus_v1.h
│   │   │   ├── secplus_v2.c
│   │   │   ├── secplus_v2.h
│   │   │   ├── smc5326.c
│   │   │   ├── smc5326.h
│   │   │   ├── somfy_keytis.c
│   │   │   ├── somfy_keytis.h
│   │   │   ├── somfy_telis.c
│   │   │   ├── somfy_telis.h
│   │   │   ├── star_line.c
│   │   │   └── star_line.h
│   │   ├── receiver.c
│   │   ├── receiver.h
│   │   ├── registry.c
│   │   ├── registry.h
│   │   ├── subghz_file_encoder_worker.c
│   │   ├── subghz_file_encoder_worker.h
│   │   ├── subghz_keystore.c
│   │   ├── subghz_keystore.h
│   │   ├── subghz_protocol_registry.h
│   │   ├── subghz_setting.c
│   │   ├── subghz_setting.h
│   │   ├── subghz_tx_rx_worker.c
│   │   ├── subghz_tx_rx_worker.h
│   │   ├── subghz_worker.c
│   │   ├── subghz_worker.h
│   │   ├── transmitter.c
│   │   ├── transmitter.h
│   │   └── types.h
│   ├── toolbox/
│   │   ├── .gitignore
│   │   ├── SConscript
│   │   ├── api_lock.h
│   │   ├── args.c
│   │   ├── args.h
│   │   ├── bit_buffer.c
│   │   ├── bit_buffer.h
│   │   ├── buffer_stream.c
│   │   ├── buffer_stream.h
│   │   ├── cli/
│   │   │   ├── cli_ansi.c
│   │   │   ├── cli_ansi.h
│   │   │   ├── cli_command.c
│   │   │   ├── cli_command.h
│   │   │   ├── cli_registry.c
│   │   │   ├── cli_registry.h
│   │   │   ├── cli_registry_i.h
│   │   │   └── shell/
│   │   │       ├── cli_shell.c
│   │   │       ├── cli_shell.h
│   │   │       ├── cli_shell_completions.c
│   │   │       ├── cli_shell_completions.h
│   │   │       ├── cli_shell_i.h
│   │   │       ├── cli_shell_line.c
│   │   │       └── cli_shell_line.h
│   │   ├── compress.c
│   │   ├── compress.h
│   │   ├── crc32_calc.c
│   │   ├── crc32_calc.h
│   │   ├── dir_walk.c
│   │   ├── dir_walk.h
│   │   ├── float_tools.c
│   │   ├── float_tools.h
│   │   ├── hex.c
│   │   ├── hex.h
│   │   ├── keys_dict.c
│   │   ├── keys_dict.h
│   │   ├── level_duration.h
│   │   ├── m_cstr_dup.h
│   │   ├── manchester_decoder.c
│   │   ├── manchester_decoder.h
│   │   ├── manchester_encoder.c
│   │   ├── manchester_encoder.h
│   │   ├── md5_calc.c
│   │   ├── md5_calc.h
│   │   ├── name_generator.c
│   │   ├── name_generator.h
│   │   ├── path.c
│   │   ├── path.h
│   │   ├── pipe.c
│   │   ├── pipe.h
│   │   ├── pretty_format.c
│   │   ├── pretty_format.h
│   │   ├── profiler.c
│   │   ├── profiler.h
│   │   ├── property.c
│   │   ├── property.h
│   │   ├── protocols/
│   │   │   ├── protocol.h
│   │   │   ├── protocol_dict.c
│   │   │   └── protocol_dict.h
│   │   ├── pulse_joiner.c
│   │   ├── pulse_joiner.h
│   │   ├── pulse_protocols/
│   │   │   ├── pulse_glue.c
│   │   │   └── pulse_glue.h
│   │   ├── saved_struct.c
│   │   ├── saved_struct.h
│   │   ├── settings_helpers/
│   │   │   ├── submenu_based.c
│   │   │   └── submenu_based.h
│   │   ├── simple_array.c
│   │   ├── simple_array.h
│   │   ├── str_buffer.c
│   │   ├── str_buffer.h
│   │   ├── stream/
│   │   │   ├── buffered_file_stream.c
│   │   │   ├── buffered_file_stream.h
│   │   │   ├── file_stream.c
│   │   │   ├── file_stream.h
│   │   │   ├── stream.c
│   │   │   ├── stream.h
│   │   │   ├── stream_cache.c
│   │   │   ├── stream_cache.h
│   │   │   ├── stream_i.h
│   │   │   ├── string_stream.c
│   │   │   └── string_stream.h
│   │   ├── strint.c
│   │   ├── strint.h
│   │   ├── tar/
│   │   │   ├── tar_archive.c
│   │   │   └── tar_archive.h
│   │   ├── value_index.c
│   │   ├── value_index.h
│   │   ├── varint.c
│   │   ├── varint.h
│   │   ├── version.c
│   │   └── version.h
│   ├── u8g2/
│   │   ├── SConscript
│   │   ├── u8g2.h
│   │   ├── u8g2_bitmap.c
│   │   ├── u8g2_box.c
│   │   ├── u8g2_buffer.c
│   │   ├── u8g2_circle.c
│   │   ├── u8g2_d_memory.c
│   │   ├── u8g2_font.c
│   │   ├── u8g2_fonts.c
│   │   ├── u8g2_glue.c
│   │   ├── u8g2_glue.h
│   │   ├── u8g2_hvline.c
│   │   ├── u8g2_intersection.c
│   │   ├── u8g2_line.c
│   │   ├── u8g2_ll_hvline.c
│   │   ├── u8g2_setup.c
│   │   ├── u8x8.h
│   │   ├── u8x8_8x8.c
│   │   ├── u8x8_byte.c
│   │   ├── u8x8_cad.c
│   │   ├── u8x8_display.c
│   │   ├── u8x8_gpio.c
│   │   └── u8x8_setup.c
│   └── update_util/
│       ├── SConscript
│       ├── dfu_file.c
│       ├── dfu_file.h
│       ├── dfu_headers.h
│       ├── int_backup.c
│       ├── int_backup.h
│       ├── resources/
│       │   ├── manifest.c
│       │   └── manifest.h
│       ├── update_manifest.c
│       ├── update_manifest.h
│       ├── update_operation.c
│       └── update_operation.h
├── scripts/
│   ├── ReadMe.md
│   ├── assets.py
│   ├── bin2dfu.py
│   ├── debug/
│   │   ├── 41-flipper.rules
│   │   ├── FreeRTOS/
│   │   │   ├── FreeRTOS.py
│   │   │   ├── FreeRTOSgdb/
│   │   │   │   ├── EventGroup.py
│   │   │   │   ├── GDBCommands.py
│   │   │   │   ├── HandleRegistry.py
│   │   │   │   ├── List.py
│   │   │   │   ├── QueueTools.py
│   │   │   │   ├── Task.py
│   │   │   │   ├── Types.py
│   │   │   │   └── __init__.py
│   │   │   ├── LICENSE
│   │   │   └── README.md
│   │   ├── PyCortexMDebug/
│   │   │   ├── LICENSE
│   │   │   ├── PyCortexMDebug.py
│   │   │   ├── README.md
│   │   │   └── cmdebug/
│   │   │       ├── __init__.py
│   │   │       ├── svd.py
│   │   │       └── svd_gdb.py
│   │   ├── README.md
│   │   ├── STM32WB55_CM4.svd
│   │   ├── flipperapps.py
│   │   ├── flipperversion.py
│   │   ├── fw.jflash
│   │   ├── gdbinit
│   │   └── stm32wbx.cfg
│   ├── fastfap.py
│   ├── fbt/
│   │   ├── __init__.py
│   │   ├── appmanifest.py
│   │   ├── elfmanifest.py
│   │   ├── fapassets.py
│   │   ├── sdk/
│   │   │   ├── __init__.py
│   │   │   ├── cache.py
│   │   │   ├── collector.py
│   │   │   └── hashes.py
│   │   ├── util.py
│   │   └── version.py
│   ├── fbt_tools/
│   │   ├── blackmagic.py
│   │   ├── ccache.py
│   │   ├── compilation_db.py
│   │   ├── crosscc.py
│   │   ├── doxygen.py
│   │   ├── fbt_apps.py
│   │   ├── fbt_assets.py
│   │   ├── fbt_debugopts.py
│   │   ├── fbt_dist.py
│   │   ├── fbt_envhooks.py
│   │   ├── fbt_extapps.py
│   │   ├── fbt_help.py
│   │   ├── fbt_hwtarget.py
│   │   ├── fbt_resources.py
│   │   ├── fbt_sdk.py
│   │   ├── fbt_tweaks.py
│   │   ├── fbt_version.py
│   │   ├── fwbin.py
│   │   ├── gdb.py
│   │   ├── jflash.py
│   │   ├── objdump.py
│   │   ├── openocd.py
│   │   ├── pvsstudio.py
│   │   ├── python3.py
│   │   ├── sconsmodular.py
│   │   ├── sconsrecursiveglob.py
│   │   └── strip.py
│   ├── flash.py
│   ├── flipper/
│   │   ├── __init__.py
│   │   ├── app.py
│   │   ├── assets/
│   │   │   ├── __init__.py
│   │   │   ├── copro.py
│   │   │   ├── coprobin.py
│   │   │   ├── dolphin.py
│   │   │   ├── heatshrink_stream.py
│   │   │   ├── icon.py
│   │   │   ├── manifest.py
│   │   │   ├── obdata.py
│   │   │   ├── tarball.py
│   │   │   └── templates/
│   │   │       ├── dolphin.c.tmpl
│   │   │       └── dolphin.h.tmpl
│   │   ├── cube.py
│   │   ├── storage.py
│   │   └── utils/
│   │       ├── __init__.py
│   │       ├── cdc.py
│   │       ├── fff.py
│   │       ├── fstree.py
│   │       ├── openocd.py
│   │       ├── programmer.py
│   │       ├── programmer_openocd.py
│   │       ├── register.py
│   │       ├── stm32wb55.py
│   │       └── templite.py
│   ├── fwflash.py
│   ├── fwsize.py
│   ├── get_env.py
│   ├── guruguru.py
│   ├── hs.py
│   ├── imglint.py
│   ├── infrared.py
│   ├── lint.py
│   ├── map_analyse_upload.py
│   ├── merge_report_qa.py
│   ├── ob.data
│   ├── ob.py
│   ├── ob_custradio.data
│   ├── otp.py
│   ├── power.py
│   ├── runfap.py
│   ├── sconsdist.py
│   ├── selfupdate.py
│   ├── send_firebase_notification.py
│   ├── serial_cli.py
│   ├── serial_cli_perf.py
│   ├── slideshow.py
│   ├── storage.py
│   ├── testops.py
│   ├── toolchain/
│   │   ├── fbtenv.cmd
│   │   ├── fbtenv.sh
│   │   └── windows-toolchain-download.ps1
│   ├── ufbt/
│   │   ├── SConstruct
│   │   ├── commandline.scons
│   │   ├── project_template/
│   │   │   ├── .gitignore
│   │   │   └── app_template/
│   │   │       ├── ${FBT_APPID}.c
│   │   │       ├── .github/
│   │   │       │   └── workflows/
│   │   │       │       └── build.yml
│   │   │       └── application.fam
│   │   ├── site_init.py
│   │   └── site_tools/
│   │       ├── ufbt_help.py
│   │       └── ufbt_state.py
│   ├── update.py
│   ├── version.py
│   └── wifi_board.py
├── site_scons/
│   ├── cc.scons
│   ├── commandline.scons
│   ├── environ.scons
│   ├── extapps.scons
│   ├── fbt_extra/
│   │   └── util.py
│   ├── firmwareopts.scons
│   └── site_init.py
├── targets/
│   ├── ReadMe.md
│   ├── SConscript
│   ├── f18/
│   │   ├── api_symbols.csv
│   │   ├── furi_hal/
│   │   │   ├── furi_hal.c
│   │   │   ├── furi_hal_power_config.c
│   │   │   ├── furi_hal_resources.c
│   │   │   ├── furi_hal_resources.h
│   │   │   ├── furi_hal_spi_config.c
│   │   │   ├── furi_hal_spi_config.h
│   │   │   ├── furi_hal_target_hw.h
│   │   │   └── furi_hal_version_device.c
│   │   └── target.json
│   ├── f7/
│   │   ├── api_symbols.csv
│   │   ├── application_ext.ld
│   │   ├── ble_glue/
│   │   │   ├── app_common.h
│   │   │   ├── app_conf.h
│   │   │   ├── app_debug.c
│   │   │   ├── app_debug.h
│   │   │   ├── ble_app.c
│   │   │   ├── ble_app.h
│   │   │   ├── ble_conf.h
│   │   │   ├── ble_const.h
│   │   │   ├── ble_dbg_conf.h
│   │   │   ├── ble_event_thread.c
│   │   │   ├── ble_event_thread.h
│   │   │   ├── ble_glue.c
│   │   │   ├── ble_glue.h
│   │   │   ├── ble_tl_hooks.c
│   │   │   ├── compiler.h
│   │   │   ├── extra_beacon.c
│   │   │   ├── extra_beacon.h
│   │   │   ├── furi_ble/
│   │   │   │   ├── event_dispatcher.c
│   │   │   │   ├── event_dispatcher.h
│   │   │   │   ├── gatt.c
│   │   │   │   ├── gatt.h
│   │   │   │   └── profile_interface.h
│   │   │   ├── gap.c
│   │   │   ├── gap.h
│   │   │   ├── hsem_map.h
│   │   │   ├── hw_ipcc.c
│   │   │   ├── osal.h
│   │   │   ├── profiles/
│   │   │   │   ├── serial_profile.c
│   │   │   │   └── serial_profile.h
│   │   │   ├── services/
│   │   │   │   ├── battery_service.c
│   │   │   │   ├── battery_service.h
│   │   │   │   ├── dev_info_service.c
│   │   │   │   ├── dev_info_service.h
│   │   │   │   ├── dev_info_service_uuid.inc
│   │   │   │   ├── serial_service.c
│   │   │   │   ├── serial_service.h
│   │   │   │   └── serial_service_uuid.inc
│   │   │   └── tl_dbg_conf.h
│   │   ├── fatfs/
│   │   │   ├── fatfs.c
│   │   │   ├── fatfs.h
│   │   │   ├── ffconf.h
│   │   │   ├── sector_cache.c
│   │   │   ├── sector_cache.h
│   │   │   ├── user_diskio.c
│   │   │   └── user_diskio.h
│   │   ├── furi_hal/
│   │   │   ├── furi_hal.c
│   │   │   ├── furi_hal_adc.c
│   │   │   ├── furi_hal_bt.c
│   │   │   ├── furi_hal_bus.c
│   │   │   ├── furi_hal_bus.h
│   │   │   ├── furi_hal_clock.c
│   │   │   ├── furi_hal_clock.h
│   │   │   ├── furi_hal_cortex.c
│   │   │   ├── furi_hal_crypto.c
│   │   │   ├── furi_hal_debug.c
│   │   │   ├── furi_hal_dma.c
│   │   │   ├── furi_hal_dma.h
│   │   │   ├── furi_hal_flash.c
│   │   │   ├── furi_hal_flash.h
│   │   │   ├── furi_hal_gpio.c
│   │   │   ├── furi_hal_gpio.h
│   │   │   ├── furi_hal_i2c.c
│   │   │   ├── furi_hal_i2c_config.c
│   │   │   ├── furi_hal_i2c_config.h
│   │   │   ├── furi_hal_i2c_types.h
│   │   │   ├── furi_hal_ibutton.c
│   │   │   ├── furi_hal_ibutton.h
│   │   │   ├── furi_hal_idle_timer.h
│   │   │   ├── furi_hal_info.c
│   │   │   ├── furi_hal_infrared.c
│   │   │   ├── furi_hal_interrupt.c
│   │   │   ├── furi_hal_interrupt.h
│   │   │   ├── furi_hal_light.c
│   │   │   ├── furi_hal_memory.c
│   │   │   ├── furi_hal_mpu.c
│   │   │   ├── furi_hal_nfc.c
│   │   │   ├── furi_hal_nfc_event.c
│   │   │   ├── furi_hal_nfc_felica.c
│   │   │   ├── furi_hal_nfc_i.h
│   │   │   ├── furi_hal_nfc_irq.c
│   │   │   ├── furi_hal_nfc_iso14443a.c
│   │   │   ├── furi_hal_nfc_iso14443b.c
│   │   │   ├── furi_hal_nfc_iso15693.c
│   │   │   ├── furi_hal_nfc_tech_i.h
│   │   │   ├── furi_hal_nfc_timer.c
│   │   │   ├── furi_hal_os.c
│   │   │   ├── furi_hal_os.h
│   │   │   ├── furi_hal_power.c
│   │   │   ├── furi_hal_power_config.c
│   │   │   ├── furi_hal_pwm.c
│   │   │   ├── furi_hal_pwm.h
│   │   │   ├── furi_hal_random.c
│   │   │   ├── furi_hal_region.c
│   │   │   ├── furi_hal_resources.c
│   │   │   ├── furi_hal_resources.h
│   │   │   ├── furi_hal_rfid.c
│   │   │   ├── furi_hal_rfid.h
│   │   │   ├── furi_hal_rtc.c
│   │   │   ├── furi_hal_rtc.h
│   │   │   ├── furi_hal_sd.c
│   │   │   ├── furi_hal_serial.c
│   │   │   ├── furi_hal_serial.h
│   │   │   ├── furi_hal_serial_control.c
│   │   │   ├── furi_hal_serial_control.h
│   │   │   ├── furi_hal_serial_types.h
│   │   │   ├── furi_hal_serial_types_i.h
│   │   │   ├── furi_hal_speaker.c
│   │   │   ├── furi_hal_spi.c
│   │   │   ├── furi_hal_spi_config.c
│   │   │   ├── furi_hal_spi_config.h
│   │   │   ├── furi_hal_spi_types.h
│   │   │   ├── furi_hal_subghz.c
│   │   │   ├── furi_hal_subghz.h
│   │   │   ├── furi_hal_target_hw.h
│   │   │   ├── furi_hal_usb.c
│   │   │   ├── furi_hal_usb_ccid.c
│   │   │   ├── furi_hal_usb_cdc.c
│   │   │   ├── furi_hal_usb_cdc.h
│   │   │   ├── furi_hal_usb_hid.c
│   │   │   ├── furi_hal_usb_i.h
│   │   │   ├── furi_hal_usb_u2f.c
│   │   │   ├── furi_hal_version.c
│   │   │   ├── furi_hal_version_device.c
│   │   │   └── furi_hal_vibro.c
│   │   ├── inc/
│   │   │   ├── FreeRTOSConfig.h
│   │   │   ├── alt_boot.h
│   │   │   ├── furi_config.h
│   │   │   ├── stm32.h
│   │   │   ├── stm32_assert.h
│   │   │   ├── stm32wb55_linker.h
│   │   │   └── stm32wb55_startup.h
│   │   ├── platform_specific/
│   │   │   ├── cxx_virtual_stub.c
│   │   │   ├── cxx_virtual_stub.h
│   │   │   ├── intrinsic_export.h
│   │   │   └── math_wrapper.h
│   │   ├── src/
│   │   │   ├── dfu.c
│   │   │   ├── main.c
│   │   │   ├── recovery.c
│   │   │   ├── stm32wb55_startup.c
│   │   │   └── update.c
│   │   ├── stm32wb55xx_flash.ld
│   │   ├── stm32wb55xx_ram_fw.ld
│   │   └── target.json
│   └── furi_hal_include/
│       ├── furi_hal.h
│       ├── furi_hal_adc.h
│       ├── furi_hal_bt.h
│       ├── furi_hal_cortex.h
│       ├── furi_hal_crypto.h
│       ├── furi_hal_debug.h
│       ├── furi_hal_i2c.h
│       ├── furi_hal_info.h
│       ├── furi_hal_infrared.h
│       ├── furi_hal_light.h
│       ├── furi_hal_memory.h
│       ├── furi_hal_mpu.h
│       ├── furi_hal_nfc.h
│       ├── furi_hal_power.h
│       ├── furi_hal_random.h
│       ├── furi_hal_region.h
│       ├── furi_hal_sd.h
│       ├── furi_hal_speaker.h
│       ├── furi_hal_spi.h
│       ├── furi_hal_usb.h
│       ├── furi_hal_usb_ccid.h
│       ├── furi_hal_usb_hid.h
│       ├── furi_hal_usb_hid_u2f.h
│       ├── furi_hal_version.h
│       └── furi_hal_vibro.h
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
---
Language:        Cpp
AccessModifierOffset: -4
AlignAfterOpenBracket: AlwaysBreak
AlignArrayOfStructures: None
AlignConsecutiveAssignments:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionPointers: false
  PadOperators:    true
AlignConsecutiveBitFields:
  Enabled:         true
  AcrossEmptyLines: true
  AcrossComments:  true
  AlignCompound:   false
  AlignFunctionPointers: false
  PadOperators:    true
AlignConsecutiveDeclarations:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCompound:   false
  AlignFunctionPointers: false
  PadOperators:    true
AlignConsecutiveMacros:
  Enabled:         true
  AcrossEmptyLines: false
  AcrossComments:  true
  AlignCompound:   true
  AlignFunctionPointers: false
  PadOperators:    true
AlignConsecutiveShortCaseStatements:
  Enabled:         false
  AcrossEmptyLines: false
  AcrossComments:  false
  AlignCaseColons: false
AlignEscapedNewlines: Left
AlignOperands:   Align
AlignTrailingComments:
  Kind:            Never
  OverEmptyLines:  0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowBreakBeforeNoexceptSpecifier: Never
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortCompoundRequirementOnASingleLine: true
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
AttributeMacros:
  - __capability
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
  AfterCaseLabel:  false
  AfterClass:      false
  AfterControlStatement: Never
  AfterEnum:       false
  AfterExternBlock: false
  AfterFunction:   false
  AfterNamespace:  false
  AfterObjCDeclaration: false
  AfterStruct:     false
  AfterUnion:      false
  BeforeCatch:     false
  BeforeElse:      false
  BeforeLambdaBody: false
  BeforeWhile:     false
  IndentBraces:    false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: true
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Leave
BreakAfterJavaFieldAnnotations: false
BreakArrays:     true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: Always
BreakBeforeBraces: Attach
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: false
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeColon
BreakStringLiterals: false
ColumnLimit:     99
CommentPragmas:  '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat:   false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: false
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
  - M_EACH
IfMacros:
  - KJ_IF_MAYBE
IncludeBlocks:   Preserve
IncludeCategories:
  - Regex:           '.*'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
    Priority:        3
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '.*'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseBlocks: false
IndentCaseLabels: false
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: None
IndentRequiresClause: false
IndentWidth:     4
IndentWrappedFunctionNames: true
InsertBraces:    false
InsertNewlineAtEOF: true
InsertTrailingCommas: None
IntegerLiteralSeparator:
  Binary:          0
  BinaryMinDigits: 0
  Decimal:         0
  DecimalMinDigits: 0
  Hex:             0
  HexMinDigits:    0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
KeepEmptyLinesAtEOF: false
LambdaBodyIndentation: Signature
LineEnding:      DeriveLF
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PackConstructorInitializers: BinPack
PenaltyBreakAssignment: 10
PenaltyBreakBeforeFirstCallParameter: 30
PenaltyBreakComment: 10
PenaltyBreakFirstLessLess: 0
PenaltyBreakOpenParenthesis: 0
PenaltyBreakScopeResolution: 500
PenaltyBreakString: 10
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 100
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
PPIndentWidth:   -1
QualifierAlignment: Leave
ReferenceAlignment: Pointer
ReflowComments:  false
RemoveBracesLLVM: false
RemoveParentheses: Leave
RemoveSemicolon: true
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SkipMacroDefinitionBody: false
SortIncludes:    Never
SortJavaStaticImport: Before
SortUsingDeclarations: Never
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeJsonColon: false
SpaceBeforeParens: Never
SpaceBeforeParensOptions:
  AfterControlStatements: false
  AfterForeachMacros: false
  AfterFunctionDefinitionName: false
  AfterFunctionDeclarationName: false
  AfterIfMacros:   false
  AfterOverloadedOperator: false
  AfterPlacementOperator: true
  AfterRequiresInClause: false
  AfterRequiresInExpression: false
  BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 1
SpacesInAngles:  Never
SpacesInContainerLiterals: false
SpacesInLineCommentPrefix:
  Minimum:         1
  Maximum:         -1
SpacesInParens:  Never
SpacesInParensOptions:
  InCStyleCasts:   false
  InConditionalStatements: false
  InEmptyParentheses: false
  Other:           false
SpacesInSquareBrackets: false
Standard:        c++20
StatementAttributeLikeMacros:
  - Q_EMIT
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION
TabWidth:        4
UseTab:          Never
VerilogBreakBetweenInstancePorts: true
WhitespaceSensitiveMacros:
  - STRINGIZE
  - PP_STRINGIZE
  - BOOST_PP_STRINGIZE
  - NS_SWIFT_NAME
  - CF_SWIFT_NAME
...



================================================
FILE: .clangd
================================================
CompileFlags:
    Add: 
        - -Wno-unknown-warning-option
        - -Wno-format
    Remove: 
        - -mword-relocations

Diagnostics:
    ClangTidy:
        FastCheckFilter: None

---

If:
    PathMatch: .*\.h
Diagnostics:
    UnusedIncludes: None


================================================
FILE: .editorconfig
================================================
root = true

[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8

[*.{cpp,h,c,py,sh}]
indent_style = space
indent_size = 4


================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.bat eol=crlf
*.ps1 eol=crlf
*.cmd eol=crlf


================================================
FILE: .github/CODEOWNERS
================================================
# Who owns all the fish by default
* @DrZlo13 @hedger @gsurkov

# Apps
/applications/debug/bt_debug_app/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/debug/accessor/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/debug/battery_test_app/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/debug/bt_debug_app/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/debug/file_browser_test/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/debug/lfrfid_debug/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/debug/text_box_test/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/debug/uart_echo/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/debug/usb_mouse/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/debug/usb_test/ @DrZlo13 @hedger @gsurkov @nminaylov

/applications/main/archive/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/main/bad_usb/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/main/gpio/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/main/ibutton/ @DrZlo13 @hedger @gsurkov
/applications/main/infrared/ @DrZlo13 @hedger @gsurkov
/applications/main/nfc/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/main/subghz/ @DrZlo13 @hedger @gsurkov @Skorpionm
/applications/main/u2f/ @DrZlo13 @hedger @gsurkov @nminaylov

/applications/services/bt/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/services/cli/ @DrZlo13 @hedger @gsurkov @nminaylov @portasynthinca3
/applications/services/crypto/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/services/desktop/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/services/dolphin/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/services/power/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/services/rpc/ @DrZlo13 @hedger @gsurkov @nminaylov

/applications/services/bt_settings_app/ @DrZlo13 @hedger @gsurkov @gornekich
/applications/services/desktop_settings/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/services/dolphin_passport/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/services/power_settings_app/ @DrZlo13 @hedger @gsurkov @gornekich

/applications/system/storage_move_to_sd/ @DrZlo13 @hedger @gsurkov @nminaylov
/applications/system/js_app/ @DrZlo13 @hedger @gsurkov @nminaylov @portasynthinca3

/applications/debug/unit_tests/ @DrZlo13 @hedger @gsurkov @nminaylov @gornekich @Skorpionm

/applications/examples/example_thermo/ @DrZlo13 @hedger @gsurkov

# Firmware targets
/targets/ @DrZlo13 @hedger @gsurkov @nminaylov

# Assets
/applications/main/infrared/resources/ @DrZlo13 @hedger @gsurkov

# Documentation
/documentation/ @DrZlo13 @hedger @gsurkov @portasynthinca3
/scripts/toolchain/ @DrZlo13 @hedger @gsurkov

# Lib
/lib/stm32wb_copro/ @DrZlo13 @hedger @gsurkov @gornekich
/lib/digital_signal/ @DrZlo13 @hedger @gsurkov @gornekich
/lib/infrared/ @DrZlo13 @hedger @gsurkov
/lib/lfrfid/ @DrZlo13 @hedger @gsurkov @nminaylov
/lib/libusb_stm32/ @DrZlo13 @hedger @gsurkov @nminaylov
/lib/mbedtls/ @DrZlo13 @hedger @gsurkov @nminaylov
/lib/mjs/ @DrZlo13 @hedger @gsurkov @nminaylov @portasynthinca3
/lib/nanopb/ @DrZlo13 @hedger @gsurkov @nminaylov
/lib/nfc/ @DrZlo13 @hedger @gsurkov @gornekich
/lib/one_wire/ @DrZlo13 @hedger @gsurkov
/lib/subghz/ @DrZlo13 @hedger @gsurkov @Skorpionm
/lib/toolbox/ @DrZlo13 @hedger @gsurkov
/lib/toolbox/cli @DrZlo13 @hedger @gsurkov @portasynthinca3

# CI/CD
/.github/workflows/ @DrZlo13 @hedger @gsurkov


================================================
FILE: .github/ISSUE_TEMPLATE/01_bug_report.yml
================================================
name: Bug report
description: File a bug reports regarding the firmware.
labels: ['bug']
body:
- type: markdown
  attributes:
    value: |
      Thank you for taking the time to fill out an issue, this template is meant for any issues related to the Flipper Zero firmware.
      If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one)
- type: textarea
  id: description
  attributes:
    label: Describe the bug.
    description: "A clear and concise description of what the bug is."
  validations:
    required: true
- type: textarea
  id: repro
  attributes: 
    label: Reproduction
    description: "How can this bug be reproduced?"
    placeholder: |
      1. Switch on...
      2. Press button '....'
      3. Wait for the moon phase
      4. It burns
  validations:
    required: true
- type: input
  id: target
  attributes:
    label: Target
    description: Specify the target
    # Target seems to be largely ignored by outside sources.
- type: textarea
  id: logs
  attributes:
    label: Logs
    description: Attach your debug logs here
    render: Text
    # Avoid rendering as Markdown here.
- type: textarea
  id: anything-else
  attributes:
    label: Anything else?
    description: Let us know if you have anything else to share.


================================================
FILE: .github/ISSUE_TEMPLATE/02_enhancements.yml
================================================
name: Enhancements
description: Suggest improvements for any existing functionality within the firmware.
body:
- type: markdown
  attributes:
    value: |
      Thank you for taking the time to fill out an issue. This template is meant for feature requests and improvements to already existing functionality.
      If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one)
- type: textarea
  id: proposal
  attributes:
    label: "Describe the enhancement you're suggesting."
    description: |
      Feel free to describe in as much detail as you wish.
  validations:
    required: true
- type: textarea
  id: anything-else
  attributes:
    label: Anything else?
    description: Let us know if you have anything else to share.


================================================
FILE: .github/ISSUE_TEMPLATE/03_feature_request.yml
================================================
name: Feature Request
description: For feature requests regarding the firmware.
labels: ['feature request']
body:
- type: markdown
  attributes:
    value: |
      Thank you for taking the time to fill out an issue, this template is meant for any feature suggestions.
      If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one)
- type: textarea
  id: proposal
  attributes:
    label: "Description of the feature you're suggesting."
    description: |
      Please describe your feature request in as many details as possible.
        - Describe what it should do.
        - Note whether it is to extend existing functionality or introduce new functionality.
  validations:
    required: true
- type: textarea
  id: anything-else
  attributes:
    label: Anything else?
    description: Let us know if you have anything else to share.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Need help?
    url: https://forum.flipperzero.one
    about: For any question regarding on how to use the Flipper Zero and its firmware.


================================================
FILE: .github/actions/submit_sdk/action.yml
================================================
name: Submit SDK to Catalog
author: hedger
description: |
  This action checks if SDK exists in the catalog and if not, adds and/or publishes it.

inputs:
  catalog-url:
    description: The URL of the Catalog API. Must not be empty or end with a /.
    required: true
  catalog-api-token:
    description: The token to use to authenticate with the Catalog API. Must not be empty.
    required: true
  firmware-api:
    description: Fimware's API version, major.minor
    required: true
  firmware-target:
    description: Firmware's target, e.g. f7/f18
    required: true
  firmware-version:
    description: Firmware's version, e.g. 0.13.37-rc3, or 0.13.37
    required: true

runs:
  using: composite
  steps:
    - name: Check inputs
      shell: bash
      run: |
        if [ -z "${{ inputs.catalog-url }}" ] ; then
          echo "Invalid catalog-url: ${{ inputs.catalog-url }}"
          exit 1
        fi
        if [ -z "${{ inputs.catalog-api-token }}" ] ; then
          echo "Invalid catalog-api-token: ${{ inputs.catalog-api-token }}"
          exit 1
        fi
        if ! echo "${{ inputs.firmware-api }}" | grep -q "^[0-9]\+\.[0-9]\+$" ; then
          echo "Invalid firmware-api: ${{ inputs.firmware-api }}"
          exit 1
        fi
        if ! echo "${{ inputs.firmware-target }}" | grep -q "^f[0-9]\+$" ; then
          echo "Invalid firmware-target: ${{ inputs.firmware-target }}"
          exit 1
        fi
        if ! echo "${{ inputs.firmware-version }}" | grep -q "^[0-9]\+\.[0-9]\+\.[0-9]\+\(-rc\)\?\([0-9]\+\)\?$" ; then
          echo "Invalid firmware-version: ${{ inputs.firmware-version }}"
          exit 1
        fi
    - name: Submit SDK
      shell: bash
      run: |
        curl --fail -sX 'GET' \
          '${{ inputs.catalog-url }}/api/v0/0/sdk?length=500' \
          -H 'Accept: application/json' > sdk_versions.json
        if jq -r -e ".[] | select((.api == \"${{ inputs.firmware-api }}\") and .target == \"${{ inputs.firmware-target }}\")" sdk_versions.json > found_sdk.json ; then
          echo "API version ${{ inputs.firmware-api }} already exists in catalog"
          if [ $(jq -r -e ".released_at" found_sdk.json) != "null" ] ; then
            echo "API version is already released"
            exit 0
          fi
          if ! echo "${{ inputs.firmware-version }}" | grep -q -- "-rc" ; then
            SDK_ID=$(jq -r ._id found_sdk.json)
            echo "Marking SDK $SDK_ID as released"
            curl --fail-with-body -X 'POST' \
              "${{ inputs.catalog-url }}/api/v0/0/sdk/${SDK_ID}/release" \
              -H 'Accept: application/json' \
              -H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \
              -d ''
          fi
        else
          echo "API version ${{ inputs.firmware-api }} doesn't exist in catalog, adding"
          curl --fail-with-body -X 'POST' \
            '${{ inputs.catalog-url }}/api/v0/0/sdk' \
            -H 'Accept: application/json' \
            -H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \
            -H 'Content-Type: application/json' \
            -d "{\"name\": \"${{ inputs.firmware-version }}\", \"target\": \"${{ inputs.firmware-target }}\", \"api\": \"${{ inputs.firmware-api }}\"}"
        fi


================================================
FILE: .github/pull_request_template.md
================================================
# What's new

- [ Describe changes here ]

# Verification 

- [ Describe how to verify changes ]

# Checklist (For Reviewer)

- [ ] PR has description of feature/bug or link to Confluence/Jira task
- [ ] Description contains actions to verify feature/bugfix
- [ ] I've built this code, uploaded it to the device and verified feature/bugfix


================================================
FILE: .github/workflows/build.yml
================================================
name: 'Build'

on:
  push:
    branches:
      - dev
    tags:
      - '*'
  pull_request:

env:
  DEFAULT_TARGET: f7
  FBT_TOOLCHAIN_PATH: /runner/_work
  FBT_GIT_SUBMODULE_SHALLOW: 1
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
  main:
    runs-on: [self-hosted, FlipperZeroShell]
    strategy:
      fail-fast: false
      matrix:
        target: [f7, f18]
    steps:
      - name: 'Wipe workspace'
        run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;

      - name: 'Checkout code'
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Get commit details'
        id: names
        run: |
          BUILD_TYPE='DEBUG=1 COMPACT=0'
          if [[ ${{ github.event_name }} == 'pull_request' ]]; then
            TYPE="pull"
          elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
            TYPE="tag"
            BUILD_TYPE='DEBUG=0 COMPACT=1'
          else
            TYPE="other"
          fi
          python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"
          echo "event_type=$TYPE" >> $GITHUB_OUTPUT
          echo "FBT_BUILD_TYPE=$BUILD_TYPE" >> $GITHUB_ENV
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
          echo "TARGET_HW=$(echo "${{ matrix.target }}" | sed 's/f//')" >> $GITHUB_ENV

      - name: 'Check API versions for consistency between targets'
        run: |
          set -e
          N_API_HEADER_SIGNATURES=`ls -1 targets/f*/api_symbols.csv | xargs -I {} sh -c "head -n2 {} | md5sum" | sort -u | wc -l`
          if [ $N_API_HEADER_SIGNATURES != 1 ] ; then
            echo API versions aren\'t matching for available targets. Please update!
            echo API versions are:
            head -n2 targets/f*/api_symbols.csv
            exit 1
          fi

      - name: 'Build the firmware and apps'
        id: build-fw
        run: |
          ./fbt TARGET_HW=$TARGET_HW $FBT_BUILD_TYPE copro_dist updater_package fap_dist
          echo "firmware_api=$(./fbt TARGET_HW=$TARGET_HW get_apiversion)" >> $GITHUB_OUTPUT

      - name: 'Check for uncommitted changes'
        run: |
          git diff --exit-code

      - name: 'Copy build output'
        run: |
          set -e
          rm -rf artifacts map_analyser_files || true
          mkdir artifacts map_analyser_files
          cp dist/${TARGET}-*/* artifacts/ || true
          tar czpf "artifacts/flipper-z-${TARGET}-resources-${SUFFIX}.tgz" \
            -C build/latest resources
          tar czpf "artifacts/flipper-z-${TARGET}-debugapps-${SUFFIX}.tgz" \
            -C dist/${TARGET}-*/apps/Debug .
          tar czpf "artifacts/flipper-z-${TARGET}-appsymbols-${SUFFIX}.tgz" \
            -C dist/${TARGET}-*/debug_elf .

      - name: 'Copy universal artifacts'
        if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET }}
        run: |
          tar czpf "artifacts/flipper-z-any-scripts-${SUFFIX}.tgz" scripts
          cp build/core2_firmware.tgz "artifacts/flipper-z-any-core2_firmware-${SUFFIX}.tgz"

      - name: 'Upload artifacts to update server'
        if: ${{ !github.event.pull_request.head.repo.fork }}
        run: |
          FILES=$(for ARTIFACT in $(find artifacts -maxdepth 1 -not -type d); do echo "-F files=@${ARTIFACT}"; done)
          curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \
              -F "branch=${BRANCH_NAME}" \
              -F "version_token=${COMMIT_SHA}" \
              ${FILES[@]} \
              "${{ secrets.INDEXER_URL }}"/firmware/uploadfiles

      - name: 'Copy & analyse map analyser files'
        if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET }}
        run: |
          cp build/${DEFAULT_TARGET}-firmware-*/firmware.elf.map map_analyser_files/firmware.elf.map
          cp build/${DEFAULT_TARGET}-firmware-*/firmware.elf map_analyser_files/firmware.elf
          source scripts/toolchain/fbtenv.sh
          python3 scripts/map_analyse_upload.py \
              "--elf_file=map_analyser_files/firmware.elf" \
              "--map_file=map_analyser_files/firmware.elf.map" \
              "--analyser_url=${{ secrets.ANALYSER_URL }}" \
              "--analyser_token=${{ secrets.ANALYSER_TOKEN }}";

      - name: 'Find previous comment'
        if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }}
        uses: peter-evans/find-comment@v3
        id: find-comment
        with:
          issue-number: ${{ github.event.pull_request.number }}
          comment-author: 'github-actions[bot]'
          body-includes: 'Compiled ${{ matrix.target }} firmware for commit'

      - name: 'Create or update comment'
        if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }}
        uses: peter-evans/create-or-update-comment@v4
        with:
          comment-id: ${{ steps.find-comment.outputs.comment-id }}
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            **Compiled ${{ matrix.target }} firmware for commit `${{steps.names.outputs.commit_sha}}`:**
            - [📦 Update package](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz)
            - [📥 DFU file](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-full-${{steps.names.outputs.suffix}}.dfu)
            - [☁️ Web/App updater](https://lab.flipper.net/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}})
            - [📊 Size report](https://fw-reports.flipp.dev/?branch=${{steps.names.outputs.branch_name}})
          edit-mode: replace

      - name: 'SDK submission to staging catalog'
        if: ${{ steps.names.outputs.event_type == 'tag' && matrix.target == env.DEFAULT_TARGET }}
        uses: ./.github/actions/submit_sdk
        with:
          catalog-url: ${{ secrets.CATALOG_STAGING_URL }}
          catalog-api-token: ${{ secrets.CATALOG_STAGING_API_TOKEN }}
          firmware-api: ${{ steps.build-fw.outputs.firmware_api }}
          firmware-target: ${{ matrix.target }}
          firmware-version: ${{ steps.names.outputs.suffix }}

      - name: 'SDK submission to prod catalog'
        if: ${{ steps.names.outputs.event_type == 'tag' && matrix.target == env.DEFAULT_TARGET }}
        uses: ./.github/actions/submit_sdk
        with:
          catalog-url: ${{ secrets.CATALOG_URL }}
          catalog-api-token: ${{ secrets.CATALOG_API_TOKEN }}
          firmware-api: ${{ steps.build-fw.outputs.firmware_api }}
          firmware-target: ${{ matrix.target }}
          firmware-version: ${{ steps.names.outputs.suffix }}


================================================
FILE: .github/workflows/build_compact.yml
================================================
name: 'Compact build'

on:
  pull_request:

env:
  FBT_TOOLCHAIN_PATH: /runner/_work
  FBT_GIT_SUBMODULE_SHALLOW: 1
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
  compact:
    runs-on: [self-hosted, FlipperZeroShell]
    strategy:
      fail-fast: false
      matrix:
        target: [f7, f18]
    steps:
      - name: 'Wipe workspace'
        run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;

      - name: 'Checkout code'
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          submodules: false
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Get commit details'
        run: |
          if [[ ${{ github.event_name }} == 'pull_request' ]]; then
            TYPE="pull"
          elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
            TYPE="tag"
          else
            TYPE="other"
          fi
          python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"

      - name: 'Build the firmware'
        id: build-fw
        run: |
          set -e
          TARGET="$(echo '${{ matrix.target }}' | sed 's/f//')"; \
          ./fbt TARGET_HW=$TARGET DEBUG=0 COMPACT=1 fap_dist updater_package
          echo "sdk-file=$(ls dist/${{ matrix.target }}-*/flipper-z-${{ matrix.target }}-sdk-*.zip)" >> $GITHUB_OUTPUT
          echo "hw-target-code=$TARGET" >> $GITHUB_OUTPUT

      - name: Deploy uFBT with SDK
        uses: flipperdevices/flipperzero-ufbt-action@v0.1
        with:
          task: setup
          sdk-file: ${{ steps.build-fw.outputs.sdk-file }}
          sdk-hw-target: ${{ steps.build-fw.outputs.hw-target-code }}

      - name: Build test app with SDK
        run: |
          mkdir testapp
          cd testapp
          ufbt create APPID=testapp
          ufbt

      - name: Build example & external apps with uFBT
        run: |
          for appdir in 'applications/examples'; do
            for app in $(find "$appdir" -maxdepth 1 -mindepth 1 -type d); do
              pushd $app
              TARGETS_FAM=$(grep "targets" application.fam || echo "${{ matrix.target }}")
              if ! grep -q "${{ matrix.target }}" <<< $TARGETS_FAM ; then
                  echo Skipping unsupported app: $app
                  popd
                  continue
              fi
              echo Building $app
              ufbt
              popd
            done
          done

## Uncomment this for a single job that will run only if all targets are built successfully          
#  report-status:
#    name: Report status
#    needs: [compact]
#    if: always() && !contains(needs.*.result, 'failure')
#    runs-on: [self-hosted, FlipperZeroShell]
#    steps:
#      - run: echo "All good ✨" ;


================================================
FILE: .github/workflows/docs.yml
================================================
name: 'Generate documentation with Doxygen'

on:
  push:
    branches:
      - dev
  pull_request:

env:
  TARGETS: f7
  DEFAULT_TARGET: f7
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
  check-secret:
    if: ${{ github.event.pull_request.head.repo.fork == false }}
    runs-on: ubuntu-latest
    outputs:
      s3-valid-config: ${{ steps.check.outputs.s3-valid-config }}

    steps:
      - name: 'Check if S3 key exists'
        id: check
        run: |
          if [[ -z "${{ secrets.FW_DOCS_AWS_ACCESS_KEY }}" || -z "${{ secrets.FW_DOCS_AWS_SECRET_KEY }}" || -z "${{ secrets.FW_DOCS_AWS_BUCKET }}" ]]; then
            echo "s3-valid-config=false" >> $GITHUB_OUTPUT;
          else
            echo "s3-valid-config=true" >> $GITHUB_OUTPUT;
          fi

  doxygen:
    if: ${{ github.event.pull_request.head.repo.fork == false }}
    runs-on: ubuntu-latest
    needs: check-secret
    steps:
      - name: 'Wipe workspace'
        run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;

      - name: 'Checkout code'
        uses: actions/checkout@v4
        with:
          submodules: true
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Get commit details'
        id: names
        run: |
          if [[ ${{ github.event_name }} == 'pull_request' ]]; then
            TYPE="pull"
          elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
            TYPE="tag"
          else
            TYPE="other"
          fi
          python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE"

      - name: install-doxygen
        uses: AdarshRawat1/Install-Doxygen@v1.0
        with:
          version: "1.12.0"

      - name: 'Generate documentation'
        run: ./fbt doxygen

      - name: 'Upload documentation'
        if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/dev' && needs.check-secret.outputs.s3-valid-config == 'true' }}
        uses: jakejarvis/s3-sync-action@v0.5.1
        env:
          AWS_S3_BUCKET: "${{ secrets.FW_DOCS_AWS_BUCKET }}"
          AWS_ACCESS_KEY_ID: "${{ secrets.FW_DOCS_AWS_ACCESS_KEY }}"
          AWS_SECRET_ACCESS_KEY: "${{ secrets.FW_DOCS_AWS_SECRET_KEY }}"
          AWS_REGION: "${{ secrets.FW_DOCS_AWS_REGION }}"
          SOURCE_DIR: "./documentation/doxygen/build/html"
          DEST_DIR: "${{steps.names.outputs.branch_name}}"
        with:
          args: "--delete"


================================================
FILE: .github/workflows/lint_and_submodule_check.yml
================================================
name: 'Lint sources & check submodule integrity'

on:
  pull_request:

env:
  TARGETS: f7
  FBT_TOOLCHAIN_PATH: /runner/_work
  SET_GH_OUTPUT: 1

jobs:
  lint_sources_check_submodules:
    runs-on: [self-hosted, FlipperZeroShell]
    steps:
      - name: 'Wipe workspace'
        run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;

      - name: 'Checkout code'
        uses: actions/checkout@v4
        with:
          fetch-depth: 2
          ref: ${{ github.sha }}

      - name: 'Check protobuf branch'
        run: |
          git submodule update --init;
          SUB_PATH="assets/protobuf";
          SUB_BRANCH="dev";
          SUB_COMMITS_MIN=40;
          cd "$SUB_PATH";
          SUBMODULE_HASH="$(git rev-parse HEAD)";
          BRANCHES=$(git branch -r --contains "$SUBMODULE_HASH");
          COMMITS_IN_BRANCH="$(git rev-list --count dev)";
          if [ $COMMITS_IN_BRANCH -lt $SUB_COMMITS_MIN ]; then
            echo "name=fails::error" >> $GITHUB_OUTPUT;
            echo "::error::Error: Too few commits in $SUB_BRANCH of submodule $SUB_PATH: $COMMITS_IN_BRANCH(expected $SUB_COMMITS_MIN+)";
            exit 1;
          fi
          if ! grep -q "/$SUB_BRANCH" <<< "$BRANCHES"; then
            echo "name=fails::error" >> $GITHUB_OUTPUT;
            echo "::error::Error: Submodule $SUB_PATH is not on branch $SUB_BRANCH";
            exit 1;
          fi

      - name: 'Check for new TODOs'
        id: check_todos
        if: github.event_name == 'pull_request'
        run: |
          set +e;
          git diff --unified=0 --no-color ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -E '^\+' | grep -i -E '(TODO|HACK|FIXME|XXX)[ :]' | grep -v -- '-nofl' > lines.log;
          MISSING_TICKETS=$( grep -v -E 'FL-[0-9]+' lines.log );
          if [ -n "$MISSING_TICKETS" ]; then
            echo "Error: Missing ticket number in \`TODO\` comment(s)" >> $GITHUB_STEP_SUMMARY;
            echo "\`\`\`" >> $GITHUB_STEP_SUMMARY;
            echo "$MISSING_TICKETS" >> $GITHUB_STEP_SUMMARY;
            echo "\`\`\`" >> $GITHUB_STEP_SUMMARY;
            echo "Error: Missing issue number in comment(s):";
            echo "$MISSING_TICKETS";
            exit 1;
          else
            echo "No new TODOs without tickets found" >> $GITHUB_STEP_SUMMARY;
          fi

      - name: 'Check Python code formatting'
        id: syntax_check_py
        if: always()
        run: |
          set +e;
          ./fbt -s lint_py 2>&1 | tee lint-py.log;
          if [ "${PIPESTATUS[0]}" -ne 0 ]; then
            # Save multiline output
            echo "errors=1" >> $GITHUB_OUTPUT;
            printf "Python Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
            echo "$(cat lint-py.log)" >> $GITHUB_STEP_SUMMARY;
            printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
            exit 1;
          else
            echo "Python Lint: all good ✨" >> $GITHUB_STEP_SUMMARY;
          fi

      - name: 'Check C++ code formatting'
        id: syntax_check_cpp
        if: always()
        run: |
          set +e;
          ./fbt -s lint 2>&1 | tee lint-cpp.log;
          if [ "${PIPESTATUS[0]}" -ne 0 ]; then
            # Save multiline output
            echo "errors=1" >> $GITHUB_OUTPUT;
            printf "C Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
            echo "$(cat lint-cpp.log)" >> $GITHUB_STEP_SUMMARY;
            printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
            exit 1;
          else
            echo "C Lint: all good ✨" >> $GITHUB_STEP_SUMMARY;
          fi

      - name: 'Check image assets'
        if: always()
        run: |
          set +e;
          ./fbt -s lint_img 2>&1 | tee lint-assets.log;
          if [ "${PIPESTATUS[0]}" -ne 0 ]; then
            # Save multiline output
            echo "errors=1" >> $GITHUB_OUTPUT;
            printf "Image Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
            echo "$(cat lint-assets.log)" >> $GITHUB_STEP_SUMMARY;
            printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
            exit 1;
          else
            echo "Image Lint: all good ✨" >> $GITHUB_STEP_SUMMARY;
          fi

      - name: Report code formatting errors
        if: ( steps.syntax_check_py.outputs.errors || steps.syntax_check_cpp.outputs.errors ) && github.event.pull_request
        run: |
          echo "Code formatting errors found";
          echo "Please run './fbt format' or './fbt format_py' to fix them";
          exit 1;


================================================
FILE: .github/workflows/merge_report.yml
================================================
name: 'Check FL ticket in PR name'

on:
  push:
    branches:
      - dev

env:
  FBT_TOOLCHAIN_PATH: /runner/_work
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
  merge_report:
    runs-on: [self-hosted, FlipperZeroShell]
    steps:
      - name: 'Wipe workspace'
        run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;

      - name: 'Checkout code'
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Get commit details'
        run: |
          if [[ ${{ github.event_name }} == 'pull_request' ]]; then
            TYPE="pull"
          elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
            TYPE="tag"
          else
            TYPE="other"
          fi
          python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"

      - name: 'Check ticket and report'
        run: |
          source scripts/toolchain/fbtenv.sh
          python3 -m pip install slack_sdk
          python3 scripts/merge_report_qa.py \
              ${{ secrets.QA_REPORT_SLACK_TOKEN }} \
              ${{ secrets.QA_REPORT_SLACK_CHANNEL }}



================================================
FILE: .github/workflows/pvs_studio.yml
================================================
name: 'Static C/C++ analysis with PVS-Studio'

on:
  push:
    branches:
      - dev
  pull_request:

env:
  TARGETS: f7
  DEFAULT_TARGET: f7
  FBT_TOOLCHAIN_PATH: /runner/_work
  FBT_GIT_SUBMODULE_SHALLOW: 1
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
  analyse_c_cpp:
    if: ${{ !github.event.pull_request.head.repo.fork }}
    runs-on: [self-hosted, FlipperZeroShell]
    steps:
      - name: 'Wipe workspace'
        run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;

      - name: 'Checkout code'
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Get commit details'
        id: names
        run: |
          if [[ ${{ github.event_name }} == 'pull_request' ]]; then
            TYPE="pull"
          elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
            TYPE="tag"
          else
            TYPE="other"
          fi
          python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"

      - name: 'Supply PVS credentials'
        run: |
          pvs-studio-analyzer credentials ${{ secrets.PVS_STUDIO_CREDENTIALS }}

      - name: 'Convert PVS-Studio output to html and detect warnings'
        id: pvs-warn
        run: |
          WARNINGS=0
          ./fbt COMPACT=1 PVSNOBROWSER=1 firmware_pvs || WARNINGS=1
          echo "warnings=${WARNINGS}" >> $GITHUB_OUTPUT
          if [[ $WARNINGS -ne 0 ]]; then
            echo "report-url=https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html" >> $GITHUB_OUTPUT
          fi

      - name: 'Upload report'
        if: ${{ !github.event.pull_request.head.repo.fork && (steps.pvs-warn.outputs.warnings != 0) }}
        uses: prewk/s3-cp-action@v2
        with:
          aws_s3_endpoint: "${{ secrets.PVS_AWS_ENDPOINT }}"
          aws_access_key_id: "${{ secrets.PVS_AWS_ACCESS_KEY }}"
          aws_secret_access_key: "${{ secrets.PVS_AWS_SECRET_KEY }}"
          source: "./build/f7-firmware-DC/pvsreport"
          dest: "s3://${{ secrets.PVS_AWS_BUCKET }}/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/"
          flags: "--recursive --acl public-read"

      - name: 'Find Previous Comment'
        if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }}
        uses: peter-evans/find-comment@v3
        id: fc
        with:
          issue-number: ${{ github.event.pull_request.number }}
          comment-author: 'github-actions[bot]'
          body-includes: 'PVS-Studio report for commit'

      - name: 'Create or update comment'
        if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }}
        uses: peter-evans/create-or-update-comment@v4
        with:
          comment-id: ${{ steps.fc.outputs.comment-id }}
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            **PVS-Studio report for commit `${{steps.names.outputs.commit_sha}}`:**
            - [Report](${{ steps.pvs-warn.outputs.report-url }})
          edit-mode: replace

      - name: 'Raise exception'
        if: ${{ steps.pvs-warn.outputs.warnings != 0 }}
        run: |
          echo "Please fix all PVS warnings before merge"
          echo "Report: ${{ steps.pvs-warn.outputs.report-url }}"
          echo "[PVS report](${{ steps.pvs-warn.outputs.report-url }})" >> $GITHUB_STEP_SUMMARY
          exit 1


================================================
FILE: .github/workflows/reindex.yml
================================================
name: 'Post-release hooks'

on:
  release:
    types: [prereleased, released]

jobs:
  reindex:
    name: 'Post-release hooks'
    runs-on: [self-hosted, FlipperZeroShell]
    steps:
      - name: 'Checkout code'
        uses: actions/checkout@v4

      - name: 'Trigger reindex'
        run: |
          curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \
              "${{ secrets.INDEXER_URL }}"/firmware/reindex;

      - name: 'Send release notification'
        if: ${{ github.event.action == 'released' }}
        run: |
          echo '${{ secrets.FIREBASE_TOKEN }}' > firebase-token.json;
          python3 -m pip install firebase-admin==6.4.0;
          python3 scripts/send_firebase_notification.py \
              "--version=${{ github.event.release.name }}" \
              "--token=firebase-token.json";

      - name: 'Remove firebase token'
        if: always()
        run: |
          rm -rf firebase-token.json;


================================================
FILE: .github/workflows/unit_tests.yml
================================================
name: 'Unit tests'
on:
  pull_request:

env:
  TARGETS: f7
  DEFAULT_TARGET: f7
  FBT_TOOLCHAIN_PATH: /opt/
  FBT_GIT_SUBMODULE_SHALLOW: 1

jobs:
  run_units_on_bench:
    runs-on: [ self-hosted, FlipperZeroTest ]
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Flash unit tests firmware'
        id: flashing
        if: success()
        timeout-minutes: 5
        run: |
          source scripts/toolchain/fbtenv.sh
          ./fbt resources firmware_latest flash LIB_DEBUG=1 FIRMWARE_APP_SET=unit_tests FORCE=1


      - name: 'Copy assets and unit data, reboot and wait for flipper'
        id: copy
        if: steps.flashing.outcome == 'success'
        timeout-minutes: 5
        run: |
          source scripts/toolchain/fbtenv.sh
          python3 scripts/testops.py -t=15 await_flipper
          python3 scripts/storage.py -f send build/latest/resources /ext
          python3 scripts/storage.py -f send /region_data /ext/.int/.region_data
          python3 scripts/power.py reboot
          python3 scripts/testops.py -t=30 await_flipper

      - name: 'Run units and validate results'
        id: run_units
        if: steps.copy.outcome == 'success'
        timeout-minutes: 5
        run: |
          source scripts/toolchain/fbtenv.sh
          python3 scripts/testops.py run_units

      - name: 'Upload test results'
        if: failure() && steps.flashing.outcome == 'success' && steps.run_units.outcome != 'skipped'
        uses: actions/upload-artifact@v4
        with:
          name: unit-tests_output
          path: unit_tests*.txt

      - name: 'Check GDB output'
        if: failure() && steps.flashing.outcome == 'success'
        run: |
          ./fbt gdb_trace_all LIB_DEBUG=1 FIRMWARE_APP_SET=unit_tests FORCE=1


================================================
FILE: .github/workflows/updater_test.yml
================================================
name: 'Updater test'
on:
  pull_request:

env:
  TARGETS: f7
  DEFAULT_TARGET: f7
  FBT_TOOLCHAIN_PATH: /opt/
  FBT_GIT_SUBMODULE_SHALLOW: 1

jobs:
  test_updater_on_bench:
    runs-on: [self-hosted, FlipperZeroTest ]
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha }}

      - name: 'Flashing target firmware'
        id: first_full_flash
        timeout-minutes: 5
        run: |
          source scripts/toolchain/fbtenv.sh
          python3 scripts/testops.py -t=180 await_flipper
          ./fbt flash_usb_full FORCE=1
          

      - name: 'Validating updater'
        id: second_full_flash
        timeout-minutes: 5
        if: success()
        run: |
          source scripts/toolchain/fbtenv.sh
          python3 scripts/testops.py -t=180 await_flipper
          ./fbt flash_usb FORCE=1
          python3 scripts/testops.py -t=180 await_flipper



================================================
FILE: .gitignore
================================================
*~
*.swp
*.swo
*.gdb_history
*.old


# LSP
.cache
compile_commands.json

# JetBrains IDEs
.idea/

# Sublime Text
.sublime-project.sublime-workspace

# Python VirtEnvironments
.env
.venv
env/
venv/

# Python Byte-compiled / optimized files
__pycache__/
*.py[cod]
*$py.class
*.pickle

.obj/
bindings/
.DS_Store
.mxproject
Brewfile.lock.json

# Kate
.kateproject
.kateconfig

# kde
.directory

# SCons
.sconsign.dblite


# bundle output
/dist

# SCons build dir
/build

# Toolchain
/toolchain

# openocd output file
openocd.log

# PVS Studio temporary files
.PVS-Studio/
PVS-Studio.log
*.PVS-Studio.*

.gdbinit

/fbt_options_local.py

# JS packages
node_modules/

# cli_perf script output in case of errors
/block.bin
/return_block.bin


================================================
FILE: .gitmodules
================================================
[submodule "lib/mlib"]
	path = lib/mlib
	url = https://github.com/P-p-H-d/mlib.git
[submodule "lib/nanopb"]
	path = lib/nanopb
	url = https://github.com/nanopb/nanopb.git
[submodule "assets/protobuf"]
	path = assets/protobuf
	url = https://github.com/flipperdevices/flipperzero-protobuf.git
	shallow = false
[submodule "lib/libusb_stm32"]
	path = lib/libusb_stm32
	url = https://github.com/flipperdevices/libusb_stm32.git
[submodule "lib/FreeRTOS-Kernel"]
	path = lib/FreeRTOS-Kernel
	url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git
[submodule "lib/microtar"]
	path = lib/microtar
	url = https://github.com/amachronic/microtar.git
[submodule "lib/mbedtls"]
	path = lib/mbedtls
	url = https://github.com/Mbed-TLS/mbedtls.git
[submodule "lib/heatshrink"]
	path = lib/heatshrink
	url = https://github.com/flipperdevices/heatshrink.git
[submodule "lib/st_cmsis_device_wb"]
	path = lib/stm32wb_cmsis
	url = https://github.com/STMicroelectronics/cmsis_device_wb
[submodule "lib/stm32wbxx_hal_driver"]
	path = lib/stm32wb_hal
	url = https://github.com/STMicroelectronics/stm32wbxx_hal_driver
[submodule "lib/stm32wb_copro"]
	path = lib/stm32wb_copro
    url = https://github.com/flipperdevices/stm32wb_copro.git
[submodule "documentation/doxygen/doxygen-awesome-css"]
	path = documentation/doxygen/doxygen-awesome-css
	url = https://github.com/jothepro/doxygen-awesome-css.git


================================================
FILE: .pvsconfig
================================================
# MLib macros we can't do much about.
//-V:M_LET:1048,1044
//-V:M_EACH:1048,1044
//-V:ARRAY_DEF:760,747,568,776,729,712,654,1103
//-V:LIST_DEF:760,747,568,712,729,654,776,1103
//-V:LIST_DUAL_PUSH_DEF:524,760,774
//-V:BPTREE_DEF2:779,1086,557,773,512
//-V:DICT_DEF2:779,524,776,760,1044,1001,729,590,568,747,685,1103
//-V:ALGO_DEF:1048,747,1044
//-V:TUPLE_DEF2:524,590,1001,760
//-V:DEQUE_DEF:658,747,760

# Non-severe malloc/null pointer deref warnings
//-V::522:2,3

# Warning about headers with copyleft license
//-V::1042

# Potentially null argument warnings
//-V:memset:575
//-V:memcpy:575
//-V:memcmp:575
//-V:strlen:575
//-V:strcpy:575
//-V:strncpy:575
//-V:strchr:575

# For loop warning on M_FOREACH
//-V:for:1044

# Bitwise OR
//-V:bit:792

# Do not complain about similar code
//-V::525

# Common embedded development pointer operations
//-V::566
//-V::1032

# Warnings about length mismatch
//-V:property_value_out:666

# Model-related warnings
//-V:with_view_model:1044,1048

# Examples
//V_EXCLUDE_PATH applications/examples/


================================================
FILE: .pvsoptions
================================================
--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/*


================================================
FILE: .sublime-project
================================================
{
    "folders":
    [
        {
            "path": ".",
        }
    ],
    "settings": {
        "LSP": {
            "clangd": {
                "enabled": true,
                "initializationOptions": {
                    // Set `"binary": "custom",` option in LSP-clangd config to use toolchain clangd
                    "custom_command": ["toolchain/current/bin/clangd"],
                    "clangd.compile-commands-dir": "build/latest",
                    "clangd.header-insertion": "never",
                    "clangd.query-driver": "**/arm-none-eabi-*",
                    "clangd.clang-tidy": true,
                },
            },
        },
   },
}


================================================
FILE: .vscode/ReadMe.md
================================================
# Visual Studio Code workspace for Flipper Zero {#vscode}

## Setup

 * To start developing with VSCode, run `./fbt vscode_dist` in project root. _That should only be done once_
 * After that, open firmware folder in VSCode: "File" > "Open folder"

 For more details on fbt, see [fbt docs](../documentation/fbt.md).


## Workflow

Commands for building firmware are invoked through Build menu: Ctrl+Shift+B.

To attach a debugging session, first build and flash firmware, then choose your debug probe in Debug menu (Ctrl+Shift+D).

Note that you have to detach debugging session before rebuilding and re-flashing firmware.


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
hello@flipperdevices.com.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: CODING_STYLE.md
================================================
# Intro

Nice to see you reading this document, we really appreciate it.

As all documents of this kind it's unable to cover everything.
But it will cover general rules that we are enforcing on PR review.

Also, we already have automatic rules checking and formatting,
but it got its limitations and this guide is still mandatory.

Some part of this project do have its own naming and coding guides.
For example: assets. Take a look into `ReadMe.md` in assets folder for more details.

Also, 3rd party libraries are none of our concern.

And yes, this set is not final and we are open to discussion.
If you want to add/remove/change something here please feel free to open new ticket.

# Inspiration

Our guide is inspired by, but not claiming to be compatible with:

- https://www.kernel.org/doc/html/v4.10/process/coding-style.html
- https://docs.unrealengine.com/en-US/Programming/Development/CodingStandard
- https://webkit.org/code-style-guidelines/

# General rules

## Readability and Simplicity first

Code we write is intended to be public.
Avoid one-liners from hell and keep code complexity under control.
Try to make code self-explanatory and add comments if needed.
Leave references to standards that you are implementing.
Use project wiki to document new/reverse engineered standards.

## Variable and function names must clearly define what it's doing

It's ok if it will be long, but it should clearly state what it's doing, without need to dive into code.
This also applies to function/method's code.
Try to avoid one letter variables.

## Encapsulation

Don't expose raw data, provide methods to work with it.
Almost everything in flipper firmware is built around this concept.

# C coding style

- Tab is 4 spaces
- Use `./fbt format` to reformat source code and check style guide before commit

## Naming

### Type names are PascalCase

Examples:

	FuriHalUsb
	Gui
	SubGhzKeystore


### Functions are snake_case

	furi_hal_usb_init
	gui_add_view_port
	subghz_keystore_read

### File and Package name is a prefix for it's content

This rule makes easier to locate types, functions and sources.

For example:

We have abstraction that we call `SubGhz Keystore`, so there will be:
file `subghz_keystore.h` we have type `SubGhzKeystore` and function `subghz_keystore_read`.

### File names

- Directories: `^[0-9A-Za-z_]+$`
- File names: `^[0-9A-Za-z_]+\.[a-z]+$`
- File extensions: `[ ".h", ".c", ".cpp", ".cxx", ".hpp" ]`

Enforced by linter.

### Standard function/method names

Suffixes:

- `alloc` - allocate and init instance. C style constructor. Returns pointer to instance.
- `free` - de-init and release instance. C style destructor. Takes pointer to instance.

# C++ coding style

Work In Progress. Use C style guide as a base.

# Python coding style

- Tab is 4 spaces
- Use [black](https://pypi.org/project/black/) to reformat source code before commit


================================================
FILE: CONTRIBUTING.md
================================================
# Welcome to FlipperZero contributing guide <!-- omit in toc -->

Thank you for investing your time in contributing to our project! 

Read our [Code of Conduct](CODE_OF_CONDUCT.md) to keep our community approachable and respectable.

In this guide you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR.

## New contributor guide

See the [ReadMe](ReadMe.md) to get an overview of the project. Here are some helpful resources to get you comfortable with open source contribution:

- [Finding ways to contribute to open source on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/finding-ways-to-contribute-to-open-source-on-github)
- [Set up Git](https://docs.github.com/en/get-started/quickstart/set-up-git)
- [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow)
- [Collaborating with pull requests](https://docs.github.com/en/github/collaborating-with-pull-requests)

## Getting started

Before writing code and creating PR make sure that it aligns with our mission and guidelines:

- All our devices are intended for research and education.
- PR that contains code intended to commit crimes is not going to be accepted.
- Your PR must comply with our [Coding Style](CODING_STYLE.md)
- Your PR must contain code compatible with project [LICENSE](LICENSE).
- PR will only be merged if it passes CI/CD.
- PR will only be merged if it passes review by code owner.

Feel free to ask questions in issues if you're not sure.

### Issues

#### Create a new issue

If you found a problem, [search if an issue already exists](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-issues-and-pull-requests#search-by-the-title-body-or-comments). If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com/flipperdevices/flipperzero-firmware/issues/new/choose). 

#### Solve an issue

Scan through our [existing issues](https://github.com/flipperdevices/flipperzero-firmware/issues) to find one that interests you.

### Make Changes

1. Fork the repository.
- Using GitHub Desktop:
  - [Getting started with GitHub Desktop](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/getting-started-with-github-desktop) will guide you through setting up Desktop.
  - Once Desktop is set up, you can use it to [fork the repo](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/cloning-and-forking-repositories-from-github-desktop)!

- Using the command line:
  - [Fork the repo](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo#fork-an-example-repository) so that you can make your changes without affecting the original project until you're ready to merge them.

2. Install build requirements

3. Create a working branch and start with your changes!

### Commit your update

Commit the changes once you are happy with them. Make sure that code compilation is not broken and passes tests. Check syntax and formatting.

### Pull Request

When you're done making the changes, open a pull request, often referred to as a PR. 
- Fill out the "Ready for review" template, so we can review your PR. This template helps reviewers understand your changes and the purpose of your pull request. 
- Don't forget to [link PR to issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one.
- Enable the checkbox to [allow maintainer edits](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so the branch can be updated for a merge.
Once you submit your PR, a Docs team member will review your proposal. We may ask questions or request for additional information.
- We may ask for changes to be made before a PR can be merged, either using [suggested changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request) or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, then commit them to your branch.
- As you update your PR and apply changes, mark each conversation as [resolved](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request#resolving-conversations).
- If you run into any merge issues, checkout this [git tutorial](https://lab.github.com/githubtraining/managing-merge-conflicts) to help you resolve merge conflicts and other issues.

### Your PR is merged!

Congratulations :tada::tada: The FlipperDevices team thanks you :sparkles:.


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: ReadMe.md
================================================
<picture>
    <source media="(prefers-color-scheme: dark)" srcset="/.github/assets/dark_theme_banner.png">
    <source media="(prefers-color-scheme: light)" srcset="/.github/assets/light_theme_banner.png">
    <img
        alt="A pixel art of a Dophin with text: Flipper Zero Official Repo"
        src="/.github/assets/light_theme_banner.png">
</picture>

# Flipper Zero Firmware

- [Flipper Zero Official Website](https://flipperzero.one). A simple way to explain to your friends what Flipper Zero can do.
- [Flipper Zero Firmware Update](https://flipperzero.one/update). Improvements for your dolphin: latest firmware releases, upgrade tools for PC and mobile devices.
- [User Documentation](https://docs.flipper.net). Learn more about your dolphin: specs, usage guides, and anything you want to ask.
- [Developer Documentation](https://developer.flipper.net/flipperzero/doxygen). Dive into the Flipper Zero Firmware source code: build system, firmware structure, and more.

# Contributing

Our main goal is to build a healthy and sustainable community around Flipper, so we're open to any new ideas and contributions. We also have some rules and taboos here, so please read this page and our [Code of Conduct](/CODE_OF_CONDUCT.md) carefully.

## I need help

The best place to search for answers is our [User Documentation](https://docs.flipper.net). If you can't find the answer there, check our [Discord Server](https://flipp.dev/discord) or our [Forum](https://forum.flipperzero.one/). If you want to contribute to the firmware development or modify it for your own needs, you can also check our [Developer Documentation](https://developer.flipper.net/flipperzero/doxygen).

## I want to report an issue

If you've found an issue and want to report it, please check our [Issues](https://github.com/flipperdevices/flipperzero-firmware/issues) page. Make sure the description contains information about the firmware version you're using, your platform, and a clear explanation of the steps to reproduce the issue.

## I want to contribute code

Before opening a PR, please confirm that your changes must be contained in the firmware. Many ideas can easily be implemented as external applications and published in the [Flipper Application Catalog](https://github.com/flipperdevices/flipper-application-catalog). If you are unsure, reach out to us on the [Discord Server](https://flipp.dev/discord) or the [Issues](https://github.com/flipperdevices/flipperzero-firmware/issues) page, and we'll help you find the right place for your code.

Also, please read our [Contribution Guide](/CONTRIBUTING.md) and our [Coding Style](/CODING_STYLE.md), and make sure your code is compatible with our [Project License](/LICENSE).

Finally, open a [Pull Request](https://github.com/flipperdevices/flipperzero-firmware/pulls) and make sure that CI/CD statuses are all green.

# Development

Flipper Zero Firmware is written in C, with some bits and pieces written in C++ and armv7m assembly languages. An intermediate level of C knowledge is recommended for comfortable programming. C, C++, and armv7m assembly languages are supported for Flipper applications.

# Firmware RoadMap

[Firmware RoadMap Miro Board](https://miro.com/app/board/uXjVO_3D6xU=/)

## Requirements

Supported development platforms:

- Windows 10+ with PowerShell and Git (x86_64)
- macOS 12+ with Command Line tools (x86_64, arm64)
- Ubuntu 20.04+ with build-essential and Git (x86_64)

Supported in-circuit debuggers (optional but highly recommended):

- [Flipper Zero Wi-Fi Development Board](https://shop.flipperzero.one/products/wifi-devboard)
- CMSIS-DAP compatible: Raspberry Pi Debug Probe and etc...
- ST-Link (v2, v3, v3mods)
- J-Link

Flipper Build System will take care of all the other dependencies.

## Cloning source code

Make sure you have enough space and clone the source code:

```shell
git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git
```

## Building

Build firmware using Flipper Build Tool:

```shell
./fbt
```

## Flashing firmware using an in-circuit debugger

Connect your in-circuit debugger to your Flipper and flash firmware using Flipper Build Tool:

```shell
./fbt flash
```

## Flashing firmware using USB

Make sure your Flipper is on, and your firmware is functioning. Connect your Flipper with a USB cable and flash firmware using Flipper Build Tool:

```shell
./fbt flash_usb
```

## Documentation

- [Flipper Build Tool](/documentation/fbt.md) - building, flashing, and debugging Flipper software
- [Applications](/documentation/AppsOnSDCard.md), [Application Manifest](/documentation/AppManifests.md) - developing, building, deploying, and debugging Flipper applications
- [Hardware combos and Un-bricking](/documentation/KeyCombo.md) - recovering your Flipper from the most nasty situations
- [Flipper File Formats](/documentation/file_formats) - everything about how Flipper stores your data and how you can work with it
- [Universal Remotes](/documentation/UniversalRemotes.md) - contributing your infrared remote to the universal remote database
- [Firmware Roadmap](https://miro.com/app/board/uXjVO_3D6xU=/)
- And much more in the [Developer Documentation](https://developer.flipper.net/flipperzero/doxygen)

# Project structure

- `applications`        - Applications and services used in firmware
- `applications_users`  - Place for your additional applications and services
- `assets`              - Assets used by applications and services
- `documentation`       - Documentation generation system configs and input files
- `furi`                - Furi Core: OS-level primitives and helpers
- `lib`                 - Our and 3rd party libraries, drivers, tools and etc...
- `site_scons`          - Build system configuration and modules
- `scripts`             - Supplementary scripts and various python libraries
- `targets`             - Firmware targets: platform specific code

Also, see `ReadMe.md` files inside those directories for further details.

# Links

- Discord: [flipp.dev/discord](https://flipp.dev/discord)
- Website: [flipperzero.one](https://flipperzero.one)
- Forum: [forum.flipperzero.one](https://forum.flipperzero.one/)
- Kickstarter: [kickstarter.com](https://www.kickstarter.com/projects/flipper-devices/flipper-zero-tamagochi-for-hackers)

## SAST Tools

- [PVS-Studio](https://pvs-studio.com/pvs-studio/?utm_source=website&utm_medium=github&utm_campaign=open_source) - static analyzer for C, C++, C#, and Java code.


================================================
FILE: SConstruct
================================================
#
# Main Flipper Build System entry point
#
# This file is evaluated by scons (the build system) every time fbt is invoked.
# Scons constructs all referenced environments & their targets' dependency
# trees on startup. So, to keep startup time as low as possible, we're hiding
# construction of certain targets behind command-line options.

import os
from fbt.util import open_browser_action

DefaultEnvironment(tools=[])

EnsurePythonVersion(3, 8)

# Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15)

# This environment is created only for loading options & validating file/dir existence
fbt_variables = SConscript("site_scons/commandline.scons")
cmd_environment = Environment(
    toolpath=["#/scripts/fbt_tools"],
    tools=[
        ("fbt_help", {"vars": fbt_variables}),
    ],
    variables=fbt_variables,
)

# Building basic environment - tools, utility methods, cross-compilation
# settings, gcc flags for Cortex-M4, basic builders and more
coreenv = SConscript(
    "site_scons/environ.scons",
    exports={"VAR_ENV": cmd_environment},
    toolpath=["#/scripts/fbt_tools"],
)
SConscript("site_scons/cc.scons", exports={"ENV": coreenv})

# Create a separate "dist" environment and add construction envs to it
distenv = coreenv.Clone(
    tools=[
        "fbt_dist",
        "fbt_debugopts",
        "openocd",
        "blackmagic",
        "jflash",
        "doxygen",
        "textfile",
    ],
    ENV=os.environ,
    UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}",
)

firmware_env = distenv.AddFwProject(
    base_env=coreenv,
    fw_type="firmware",
    fw_env_key="FW_ENV",
)

# If enabled, initialize updater-related targets
if GetOption("fullenv") or any(
    filter(lambda target: "updater" in target or "flash_usb" in target, BUILD_TARGETS)
):
    updater_env = distenv.AddFwProject(
        base_env=coreenv,
        fw_type="updater",
        fw_env_key="UPD_ENV",
    )

    # Target for self-update package
    dist_basic_arguments = [
        "${ARGS}",
        "--bundlever",
        "${UPDATE_VERSION_STRING}",
    ]
    dist_radio_arguments = [
        "--radio",
        "${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}",
        "--radiotype",
        "${COPRO_STACK_TYPE}",
        "${COPRO_DISCLAIMER}",
        "--obdata",
        "${ROOT_DIR.abspath}/${COPRO_OB_DATA}",
        "--stackversion",
        "${COPRO_CUBE_VERSION}",
    ]
    dist_resource_arguments = [
        "-r",
        firmware_env.subst("${RESOURCES_ROOT}"),
    ]
    dist_splash_arguments = (
        [
            "--splash",
            distenv.subst("assets/slideshow/$UPDATE_SPLASH"),
        ]
        if distenv["UPDATE_SPLASH"]
        else []
    )

    selfupdate_dist = distenv.DistCommand(
        "updater_package",
        (distenv["DIST_DEPENDS"], firmware_env["FW_RESOURCES_MANIFEST"]),
        DIST_EXTRA=[
            *dist_basic_arguments,
            *dist_radio_arguments,
            *dist_resource_arguments,
            *dist_splash_arguments,
        ],
    )

    selfupdate_min_dist = distenv.DistCommand(
        "updater_minpackage",
        distenv["DIST_DEPENDS"],
        DIST_EXTRA=dist_basic_arguments,
    )

    # Updater debug
    distenv.PhonyTarget(
        "updater_debug",
        "${GDBPYCOM}",
        source=updater_env["FW_ELF"],
        GDBREMOTE="${OPENOCD_GDB_PIPE}",
    )

    distenv.PhonyTarget(
        "updater_blackmagic",
        "${GDBPYCOM}",
        source=updater_env["FW_ELF"],
        GDBOPTS=distenv.subst("$GDBOPTS_BLACKMAGIC"),
        GDBREMOTE="${BLACKMAGIC_ADDR}",
    )

    # Installation over USB & CLI
    usb_update_package = distenv.AddUsbFlashTarget(
        "#build/usbinstall.flag",
        (firmware_env["FW_RESOURCES_MANIFEST"], selfupdate_dist),
    )
    distenv.Alias("flash_usb_full", usb_update_package)

    usb_minupdate_package = distenv.AddUsbFlashTarget(
        "#build/minusbinstall.flag", (selfupdate_min_dist,)
    )
    distenv.Alias("flash_usb", usb_minupdate_package)


# Target for copying & renaming binaries to dist folder
basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"])
distenv.Default(basic_dist)

dist_dir_name = distenv.GetProjetDirName()
dist_dir = distenv.Dir(f"#/dist/{dist_dir_name}")
external_apps_artifacts = firmware_env["FW_EXTAPPS"]
external_app_list = external_apps_artifacts.application_map.values()

fap_dist = [
    distenv.Install(
        dist_dir.Dir("debug_elf"),
        list(app_artifact.debug for app_artifact in external_app_list),
    ),
    *(
        distenv.Install(
            dist_dir.File(dist_entry[1]).dir,
            app_artifact.compact,
        )
        for app_artifact in external_app_list
        for dist_entry in app_artifact.dist_entries
    ),
]
Depends(
    fap_dist,
    list(app_artifact.validator for app_artifact in external_app_list),
)
Alias("fap_dist", fap_dist)

# Copy all faps to device

fap_deploy = distenv.PhonyTarget(
    "fap_deploy",
    Action(
        [
            [
                "${PYTHON3}",
                "${FBT_SCRIPT_DIR}/storage.py",
                "-p",
                "${FLIP_PORT}",
                "send",
                "${SOURCE}",
                "/ext/apps",
                "${ARGS}",
            ]
        ]
    ),
    source=firmware_env.Dir(("${RESOURCES_ROOT}/apps")),
)
Depends(fap_deploy, firmware_env["FW_RESOURCES_MANIFEST"])


# Target for bundling core2 package for qFlipper
copro_dist = distenv.CoproBuilder(
    "#/build/core2_firmware.tgz",
    [],
)
distenv.AlwaysBuild(copro_dist)
distenv.Alias("copro_dist", copro_dist)


firmware_flash = distenv.AddFwFlashTarget(firmware_env)
distenv.Alias("flash", firmware_flash)

# To be implemented in fwflash.py
firmware_jflash = distenv.AddJFlashTarget(firmware_env)
distenv.Alias("jflash", firmware_jflash)

distenv.PhonyTarget(
    "gdb_trace_all",
    [["${GDB}", "${GDBOPTS}", "${SOURCES}", "${GDBFLASH}"]],
    source=firmware_env["FW_ELF"],
    GDBOPTS="${GDBOPTS_BASE}",
    GDBREMOTE="${OPENOCD_GDB_PIPE}",
    GDBFLASH=[
        "-ex",
        "thread apply all bt",
        "-ex",
        "quit",
    ],
)

# Debugging firmware
firmware_debug = distenv.PhonyTarget(
    "debug",
    "${GDBPYCOM}",
    source=firmware_env["FW_ELF"],
    GDBOPTS="${GDBOPTS_BASE}",
    GDBREMOTE="${OPENOCD_GDB_PIPE}",
    FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"],
)
distenv.Depends(firmware_debug, firmware_flash)

firmware_blackmagic = distenv.PhonyTarget(
    "blackmagic",
    "${GDBPYCOM}",
    source=firmware_env["FW_ELF"],
    GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
    GDBREMOTE="${BLACKMAGIC_ADDR}",
    FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"],
)
distenv.Depends(firmware_blackmagic, firmware_flash)

# Debug alien elf
debug_other_opts = [
    "-ex",
    "source ${FBT_DEBUG_DIR}/PyCortexMDebug/PyCortexMDebug.py",
    # "-ex",
    # "source ${FBT_DEBUG_DIR}/FreeRTOS/FreeRTOS.py",
    "-ex",
    "source ${FBT_DEBUG_DIR}/flipperversion.py",
    "-ex",
    "fw-version",
]

distenv.PhonyTarget(
    "debug_other",
    "${GDBPYCOM}",
    GDBOPTS="${GDBOPTS_BASE}",
    GDBREMOTE="${OPENOCD_GDB_PIPE}",
    GDBPYOPTS=debug_other_opts,
)

distenv.PhonyTarget(
    "debug_other_blackmagic",
    "${GDBPYCOM}",
    GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}",
    GDBREMOTE="${BLACKMAGIC_ADDR}",
    GDBPYOPTS=debug_other_opts,
)


# Just start OpenOCD
distenv.PhonyTarget(
    "openocd",
    [["${OPENOCDCOM}", "${ARGS}"]],
)

# Linter
distenv.PhonyTarget(
    "lint",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/lint.py",
            "check",
            "${LINT_SOURCES}",
            "${ARGS}",
        ]
    ],
    LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]],
)

distenv.PhonyTarget(
    "format",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/lint.py",
            "format",
            "${LINT_SOURCES}",
            "${ARGS}",
        ]
    ],
    LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]],
)

# PY_LINT_SOURCES contains recursively-built modules' SConscript files
# Here we add additional Python files residing in repo root
firmware_env.Append(
    PY_LINT_SOURCES=[
        # Py code folders
        "site_scons",
        "scripts",
        "applications",
        "applications_user",
        "assets",
        "targets",
        # Extra files
        "SConstruct",
        "firmware.scons",
        "fbt_options.py",
    ],
    IMG_LINT_SOURCES=[
        # Image assets
        "applications",
        "assets",
    ],
)


black_commandline = [
    [
        "@${PYTHON3}",
        "-m",
        "black",
        "${PY_BLACK_ARGS}",
        "${PY_LINT_SOURCES}",
        "${ARGS}",
    ]
]
black_base_args = [
    "--include",
    '"(\\.scons|\\.py|SConscript|SConstruct|\\.fam)$"',
]

distenv.PhonyTarget(
    "lint_py",
    black_commandline,
    PY_BLACK_ARGS=[
        "--check",
        "--diff",
        *black_base_args,
    ],
    PY_LINT_SOURCES=firmware_env["PY_LINT_SOURCES"],
)

distenv.PhonyTarget(
    "format_py",
    black_commandline,
    PY_BLACK_ARGS=black_base_args,
    PY_LINT_SOURCES=firmware_env["PY_LINT_SOURCES"],
)

# Image assets linting
distenv.PhonyTarget(
    "lint_img",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/imglint.py",
            "check",
            "${IMG_LINT_SOURCES}",
            "${ARGS}",
        ]
    ],
    IMG_LINT_SOURCES=firmware_env["IMG_LINT_SOURCES"],
)

distenv.PhonyTarget(
    "format_img",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/imglint.py",
            "format",
            "${IMG_LINT_SOURCES}",
            "${ARGS}",
        ]
    ],
    IMG_LINT_SOURCES=firmware_env["IMG_LINT_SOURCES"],
)

distenv.Alias("lint_all", ["lint", "lint_py", "lint_img"])
distenv.Alias("format_all", ["format", "format_py", "format_img"])


# Start Flipper CLI via PySerial's miniterm
distenv.PhonyTarget(
    "cli",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/serial_cli.py",
            "-p",
            "${FLIP_PORT}",
            "${ARGS}",
        ]
    ],
)


# Measure CLI loopback performance
distenv.PhonyTarget(
    "cli_perf",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/serial_cli_perf.py",
            "-p",
            "${FLIP_PORT}",
            "${ARGS}",
        ]
    ],
)

# Update WiFi devboard firmware with release channel
distenv.PhonyTarget(
    "devboard_flash",
    [
        [
            "${PYTHON3}",
            "${FBT_SCRIPT_DIR}/wifi_board.py",
            "${ARGS}",
        ]
    ],
)


# Find blackmagic probe
distenv.PhonyTarget(
    "get_blackmagic",
    "@echo $( ${BLACKMAGIC_ADDR} $)",
)


# Find STLink probe ids
distenv.PhonyTarget(
    "get_stlink",
    distenv.Action(
        lambda **_: distenv.GetDevices(),
        None,
    ),
)

# Prepare vscode environment
vscode_dist = distenv.Install(
    "#.vscode",
    [
        distenv.Glob("#.vscode/example/*.json", exclude="*.tmpl"),
        distenv.Glob("#.vscode/example/${LANG_SERVER}/*.json"),
    ],
)
for template_file in distenv.Glob("#.vscode/example/*.tmpl"):
    vscode_dist.append(
        distenv.Substfile(
            distenv.Dir("#.vscode").File(template_file.name.replace(".tmpl", "")),
            template_file,
            SUBST_DICT={
                "@FBT_PLATFORM_EXECUTABLE_EXT@": ".exe" if os.name == "nt" else ""
            },
        )
    )
distenv.Precious(vscode_dist)
distenv.NoClean(vscode_dist)
distenv.Alias("vscode_dist", (vscode_dist, firmware_env["FW_CDB"]))

# Configure shell with build tools
distenv.PhonyTarget(
    "env",
    "@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)",
)

doxy_build = distenv.DoxyBuild(
    "documentation/doxygen/build/html/index.html",
    "documentation/doxygen/Doxyfile-awesome.cfg",
    doxy_env_variables={
        "DOXY_SRC_ROOT": Dir(".").abspath,
        "DOXY_BUILD_DIR": Dir("documentation/doxygen/build").abspath,
        "DOXY_CONFIG_DIR": "documentation/doxygen",
    },
)
distenv.Alias("doxygen", doxy_build)
distenv.AlwaysBuild(doxy_build)

# Open generated documentation in browser
distenv.PhonyTarget("doxy", open_browser_action, source=doxy_build)


================================================
FILE: applications/ReadMe.md
================================================
# Structure

## debug 

Applications for factory testing the Flipper.

- `accessor`            - Wiegand server 
- `battery_test_app`    - Battery debug app
- `blink_test`          - LED blinker   
- `bt_debug_app`        - BT test app. Requires full BT stack installed
- `display_test`        - Various display tests & tweaks
- `file_browser_test`   - Test UI for file picker
- `keypad_test`         - Keypad test
- `lfrfid_debug`        - LF RFID debug tool
- `text_box_test`       - UI tests
- `uart_echo`           - UART mode test 
- `unit_tests`          - Unit tests
- `usb_mouse`           - USB HID test
- `usb_test`            - Other USB tests
- `vibro_test`          - Vibro test


## main

Applications for main Flipper menu.

- `archive`             - Archive and file manager 
- `bad_usb`             - Bad USB application
- `gpio`                - GPIO application: includes USART bridge and GPIO control
- `ibutton`             - iButton application, onewire keys and more
- `infrared`            - Infrared application, controls your IR devices
- `lfrfid`              - LF RFID application
- `nfc`                 - NFC application, HF rfid, EMV and etc
- `subghz`              - SubGhz application, 433 fobs and etc
- `u2f`                 - U2F Application


## services

Background services providing system APIs to applications.

- `applications.h`      - Firmware application list header

- `bt`                  - BLE service and application
- `cli`                 - Console service and API
- `crypto`              - Crypto cli tools
- `desktop`             - Desktop service
- `dialogs`             - Dialogs service: GUI Dialogs for your app
- `dolphin`             - Dolphin service and supplementary apps
- `gui`                 - GUI service and API
- `input`               - Input service
- `loader`              - Application loader service
- `notification`        - Notification service 
- `power`               - Power service
- `rpc`                 - RPC service and API
- `storage`             - Storage service, internal + sdcard


## settings

Small applications providing configuration for basic firmware and its services.

- `about`               - Small About application that shows flipper info
- `bt_settings_app`     - Bluetooth options
- `desktop_settings`    - Desktop configuration
- `dolphin_passport`    - Dolphin passport app
- `notification_settings` - LCD brightness, sound volume, etc configuration
- `power_settings_app`  - Basic power options
- `storage_settings`    - Storage settings app
- `system`              - System settings


## system

Utility apps not visible in other menus, plus few external apps pre-packaged with the firmware.

- `hid_app`             - BLE & USB HID remote
- `js_app`              - JS engine runner
- `snake_game`          - Snake game
- `storage_move_to_sd`  - Data migration tool for internal storage
- `updater`             - Update service & application


================================================
FILE: applications/debug/accessor/accessor.cpp
================================================
#include "accessor_app.h"

// app enter function
extern "C" int32_t accessor_app(void* p) {
    UNUSED(p);
    AccessorApp* app = new AccessorApp();
    app->run();
    delete app;

    return 255;
}


================================================
FILE: applications/debug/accessor/accessor_app.cpp
================================================
#include "accessor_app.h"
#include <furi.h>
#include <furi_hal.h>
#include <stdarg.h>
#include <power/power_service/power.h>

void AccessorApp::run(void) {
    AccessorEvent event;
    bool consumed;
    bool exit = false;

    wiegand.begin();
    onewire_host_start(onewire_host);

    scenes[current_scene]->on_enter(this);

    while(!exit) {
        view.receive_event(&event);

        consumed = scenes[current_scene]->on_event(this, &event);

        if(!consumed) {
            if(event.type == AccessorEvent::Type::Back) {
                exit = switch_to_previous_scene();
            }
        }
    };

    scenes[current_scene]->on_exit(this);

    wiegand.end();
    onewire_host_stop(onewire_host);
}

AccessorApp::AccessorApp()
    : text_store{0} {
    notification = static_cast<NotificationApp*>(furi_record_open(RECORD_NOTIFICATION));
    expansion = static_cast<Expansion*>(furi_record_open(RECORD_EXPANSION));
    power = static_cast<Power*>(furi_record_open(RECORD_POWER));
    onewire_host = onewire_host_alloc(&gpio_ibutton);
    expansion_disable(expansion);
    power_enable_otg(power, true);
}

AccessorApp::~AccessorApp() {
    power_enable_otg(power, false);
    expansion_enable(expansion);
    furi_record_close(RECORD_EXPANSION);
    furi_record_close(RECORD_NOTIFICATION);
    furi_record_close(RECORD_POWER);
    onewire_host_free(onewire_host);
}

AccessorAppViewManager* AccessorApp::get_view_manager() {
    return &view;
}

void AccessorApp::switch_to_next_scene(Scene next_scene) {
    previous_scenes_list.push_front(current_scene);

    if(next_scene != Scene::Exit) {
        scenes[current_scene]->on_exit(this);
        current_scene = next_scene;
        scenes[current_scene]->on_enter(this);
    }
}

void AccessorApp::search_and_switch_to_previous_scene(std::initializer_list<Scene> scenes_list) {
    Scene previous_scene = Scene::Start;
    bool scene_found = false;

    while(!scene_found) {
        previous_scene = get_previous_scene();
        for(Scene element : scenes_list) {
            if(previous_scene == element || previous_scene == Scene::Start) {
                scene_found = true;
                break;
            }
        }
    }

    scenes[current_scene]->on_exit(this);
    current_scene = previous_scene;
    scenes[current_scene]->on_enter(this);
}

bool AccessorApp::switch_to_previous_scene(uint8_t count) {
    Scene previous_scene = Scene::Start;

    for(uint8_t i = 0; i < count; i++) {
        previous_scene = get_previous_scene();
        if(previous_scene == Scene::Exit) break;
    }

    if(previous_scene == Scene::Exit) {
        return true;
    } else {
        scenes[current_scene]->on_exit(this);
        current_scene = previous_scene;
        scenes[current_scene]->on_enter(this);
        return false;
    }
}

AccessorApp::Scene AccessorApp::get_previous_scene() {
    Scene scene = previous_scenes_list.front();
    previous_scenes_list.pop_front();
    return scene;
}

/***************************** NOTIFY *******************************/

void AccessorApp::notify_green_blink() {
    notification_message(notification, &sequence_blink_green_10);
}

void AccessorApp::notify_success() {
    notification_message(notification, &sequence_success);
}

/*************************** TEXT STORE *****************************/

char* AccessorApp::get_text_store() {
    return text_store;
}

uint8_t AccessorApp::get_text_store_size() {
    return text_store_size;
}

void AccessorApp::set_text_store(const char* text...) {
    va_list args;
    va_start(args, text);

    vsnprintf(text_store, text_store_size, text, args);

    va_end(args);
}

/*************************** APP RESOURCES *****************************/

WIEGAND* AccessorApp::get_wiegand() {
    return &wiegand;
}

OneWireHost* AccessorApp::get_one_wire() {
    return onewire_host;
}


================================================
FILE: applications/debug/accessor/accessor_app.h
================================================
#pragma once
#include <map>
#include <list>
#include "accessor_view_manager.h"
#include "scene/accessor_scene_start.h"
#include "helpers/wiegand.h"
#include <one_wire/one_wire_host.h>
#include <notification/notification_messages.h>
#include <expansion/expansion.h>
#include <power/power_service/power.h>

class AccessorApp {
public:
    void run(void);

    AccessorApp(void);
    ~AccessorApp(void);

    enum class Scene : uint8_t {
        Exit,
        Start,
    };

    AccessorAppViewManager* get_view_manager(void);
    void switch_to_next_scene(Scene index);
    void search_and_switch_to_previous_scene(std::initializer_list<Scene> scenes_list);
    bool switch_to_previous_scene(uint8_t count = 1);
    Scene get_previous_scene(void);

    void notify_green_blink(void);
    void notify_success(void);

    char* get_text_store(void);
    uint8_t get_text_store_size(void);
    void set_text_store(const char* text...);

    WIEGAND* get_wiegand(void);
    OneWireHost* get_one_wire(void);

private:
    std::list<Scene> previous_scenes_list = {Scene::Exit};
    Scene current_scene = Scene::Start;
    AccessorAppViewManager view;

    std::map<Scene, AccessorScene*> scenes = {
        {Scene::Start, new AccessorSceneStart()},
    };

    static const uint8_t text_store_size = 128;
    char text_store[text_store_size + 1];

    WIEGAND wiegand;
    OneWireHost* onewire_host;

    NotificationApp* notification;
    Expansion* expansion;
    Power* power;
};


================================================
FILE: applications/debug/accessor/accessor_event.h
================================================
#pragma once
#include <stdint.h>

class AccessorEvent {
public:
    // events enum
    enum class Type : uint8_t {
        Tick,
        Back,
    };

    // payload
    union {
        uint32_t menu_index;
    } payload;

    // event type
    Type type;
};


================================================
FILE: applications/debug/accessor/accessor_view_manager.cpp
================================================
#include "accessor_view_manager.h"
#include "accessor_event.h"
#include "callback_connector.h"

AccessorAppViewManager::AccessorAppViewManager() {
    event_queue = furi_message_queue_alloc(10, sizeof(AccessorEvent));

    view_holder = view_holder_alloc();
    auto callback =
        cbc::obtain_connector(this, &AccessorAppViewManager::view_holder_back_callback);

    // allocate views
    submenu = submenu_alloc();
    popup = popup_alloc();

    // set back callback
    view_holder_set_back_callback(view_holder, callback, NULL);

    gui = static_cast<Gui*>(furi_record_open(RECORD_GUI));
    view_holder_attach_to_gui(view_holder, gui);
}

AccessorAppViewManager::~AccessorAppViewManager() {
    // remove current view
    view_holder_set_view(view_holder, NULL);
    // free view modules
    furi_record_close(RECORD_GUI);
    submenu_free(submenu);
    popup_free(popup);
    // free view holder
    view_holder_free(view_holder);
    // free event queue
    furi_message_queue_free(event_queue);
}

void AccessorAppViewManager::switch_to(ViewType type) {
    View* view;

    switch(type) {
    case ViewType::Submenu:
        view = submenu_get_view(submenu);
        break;
    case ViewType::Popup:
        view = popup_get_view(popup);
        break;
    default:
        furi_crash();
    }

    view_holder_set_view(view_holder, view);
}

Submenu* AccessorAppViewManager::get_submenu() {
    return submenu;
}

Popup* AccessorAppViewManager::get_popup() {
    return popup;
}

void AccessorAppViewManager::receive_event(AccessorEvent* event) {
    if(furi_message_queue_get(event_queue, event, 100) != FuriStatusOk) {
        event->type = AccessorEvent::Type::Tick;
    }
}

void AccessorAppViewManager::send_event(AccessorEvent* event) {
    FuriStatus result = furi_message_queue_put(event_queue, event, 0);
    furi_check(result == FuriStatusOk);
}

void AccessorAppViewManager::view_holder_back_callback(void*) {
    if(event_queue != NULL) {
        AccessorEvent event;
        event.type = AccessorEvent::Type::Back;
        send_event(&event);
    }
}


================================================
FILE: applications/debug/accessor/accessor_view_manager.h
================================================
#pragma once
#include <furi.h>
#include <gui/view_holder.h>
#include <gui/modules/submenu.h>
#include <gui/modules/popup.h>
#include "accessor_event.h"

class AccessorAppViewManager {
public:
    enum class ViewType : uint8_t {
        Submenu,
        Popup,
    };

    FuriMessageQueue* event_queue;

    AccessorAppViewManager(void);
    ~AccessorAppViewManager(void);

    void switch_to(ViewType type);

    void receive_event(AccessorEvent* event);
    void send_event(AccessorEvent* event);

    Submenu* get_submenu(void);
    Popup* get_popup(void);

private:
    Gui* gui;
    ViewHolder* view_holder;

    void view_holder_back_callback(void* context);

    // view elements
    Submenu* submenu;
    Popup* popup;
};


================================================
FILE: applications/debug/accessor/application.fam
================================================
App(
    appid="accessor",
    name="Accessor",
    apptype=FlipperAppType.DEBUG,
    targets=["f7"],
    entry_point="accessor_app",
    requires=["gui"],
    stack_size=4 * 1024,
    fap_category="Debug",
)


================================================
FILE: applications/debug/accessor/callback_connector.h
================================================
#ifndef CALLBACKCONNECTOR_H
#define CALLBACKCONNECTOR_H

#ifdef __cplusplus
#include <functional>
namespace cbc {
namespace Details {

template <std::size_t Tag, typename T, typename Ret, typename... Args>
class FuncMemberWrapper {
public:
    FuncMemberWrapper() = delete;
    using member_fun_t = Ret (T::*)(Args...);
    using const_member_fun_t = Ret (T::*)(Args...) const;
    static auto instantiate(T* t, member_fun_t ptr) {
        obj = t;
        member = ptr;
        return MetaCall;
    }

    static auto instantiate(T* t, const_member_fun_t ptr) {
        obj = t;
        const_member = ptr;
        return ConstMetaCall;
    }

private:
    static auto MetaCall(Args... args) {
        return (*obj.*member)(args...);
    }
    static auto ConstMetaCall(Args... args) {
        return (*obj.*const_member)(args...);
    }
    static T* obj;
    static member_fun_t member;
    static const_member_fun_t const_member;
};
template <std::size_t Tag, typename T, typename Ret, typename... Args>
T* FuncMemberWrapper<Tag, T, Ret, Args...>::obj{};

template <std::size_t Tag, typename T, typename Ret, typename... Args>
typename FuncMemberWrapper<Tag, T, Ret, Args...>::member_fun_t
    FuncMemberWrapper<Tag, T, Ret, Args...>::member{};

template <std::size_t Tag, typename T, typename Ret, typename... Args>
typename FuncMemberWrapper<Tag, T, Ret, Args...>::const_member_fun_t
    FuncMemberWrapper<Tag, T, Ret, Args...>::const_member{};

template <typename Functor, typename Ret, typename... Args>
struct FunctorWrapper {
public:
    static std::function<Ret(Args...)> functor;
    static auto instatiate(Functor fn) {
        functor = std::move(fn);
        return MetaCall;
    }

private:
    static auto MetaCall(Args... args) {
        return functor(args...);
    }
};

template <typename Functor, typename Ret, typename... Args>
std::function<Ret(Args...)> FunctorWrapper<Functor, Ret, Args...>::functor;

template <typename Functor, typename Ret, typename T, typename... Args>
auto deducer(Functor obj, Ret (T::*)(Args...) const) {
    return FunctorWrapper<Functor, Ret, Args...>::instatiate(std::move(obj));
}

template <typename Functor, typename Ret, typename T, typename... Args>
auto deducer(Functor obj, Ret (T::*)(Args...)) {
    return FunctorWrapper<Functor, Ret, Args...>::instatiate(std::move(obj));
}

template <std::size_t tag, typename T, typename Ret, typename... Args>
auto const_instantiate(T* t, Ret (T::*ptr)(Args...) const) {
    return FuncMemberWrapper<tag, T, Ret, Args...>::instantiate(t, ptr);
}

template <std::size_t tag, typename T, typename Func>
auto const_instantiate(T* t, Func ptr) {
    return const_instantiate(t, ptr);
}

} //end of Details scope

template <std::size_t tag = 0, typename T, typename Ret, typename... Args>
auto obtain_connector(T* t, Ret (T::*ptr)(Args...)) {
    return Details::FuncMemberWrapper<tag, T, Ret, Args...>::instantiate(t, ptr);
}

template <std::size_t tag = 0, typename T, typename Ret, typename... Args>
auto obtain_connector(T* t, Ret (T::*ptr)(Args...) const) {
    return Details::FuncMemberWrapper<tag, T, Ret, Args...>::instantiate(t, ptr);
}

template <typename Functor>
auto obtain_connector(Functor functor) {
    return Details::deducer(std::move(functor), &Functor::operator());
}
} //end of cbc scope

#endif // __cplusplus
#endif // CALLBACKCONNECTOR_H


================================================
FILE: applications/debug/accessor/helpers/wiegand.cpp
================================================
#include "wiegand.h"
#include <furi.h>
#include <furi_hal.h>

unsigned long WIEGAND::_cardTempHigh = 0;
unsigned long WIEGAND::_cardTemp = 0;
unsigned long WIEGAND::_lastWiegand = 0;
unsigned long WIEGAND::_code = 0;
unsigned long WIEGAND::_codeHigh = 0;
int WIEGAND::_bitCount = 0;
int WIEGAND::_wiegandType = 0;

constexpr uint32_t clocks_in_ms = 64 * 1000;
const GpioPin* const pinD0 = &gpio_ext_pa4;
const GpioPin* const pinD1 = &gpio_ext_pa7;

WIEGAND::WIEGAND() {
}

unsigned long WIEGAND::getCode() {
    return _code;
}

unsigned long WIEGAND::getCodeHigh() {
    return _codeHigh;
}

int WIEGAND::getWiegandType() {
    return _wiegandType;
}

bool WIEGAND::available() {
    bool ret;
    FURI_CRITICAL_ENTER();
    ret = DoWiegandConversion();
    FURI_CRITICAL_EXIT();
    return ret;
}

static void input_isr_d0(void* _ctx) {
    WIEGAND* _this = static_cast<WIEGAND*>(_ctx);
    _this->ReadD0();
}

static void input_isr_d1(void* _ctx) {
    WIEGAND* _this = static_cast<WIEGAND*>(_ctx);
    _this->ReadD1();
}

void WIEGAND::begin() {
    _lastWiegand = 0;
    _cardTempHigh = 0;
    _cardTemp = 0;
    _code = 0;
    _wiegandType = 0;
    _bitCount = 0;

    furi_hal_gpio_init_simple(pinD0, GpioModeInterruptFall); // Set D0 pin as input
    furi_hal_gpio_init_simple(pinD1, GpioModeInterruptFall); // Set D1 pin as input

    furi_hal_gpio_add_int_callback(pinD0, input_isr_d0, this);
    furi_hal_gpio_add_int_callback(pinD1, input_isr_d1, this);
}

void WIEGAND::end() {
    furi_hal_gpio_remove_int_callback(pinD0);
    furi_hal_gpio_remove_int_callback(pinD1);

    furi_hal_gpio_init_simple(pinD0, GpioModeAnalog);
    furi_hal_gpio_init_simple(pinD1, GpioModeAnalog);
}

void WIEGAND::ReadD0() {
    _bitCount++; // Increment bit count for Interrupt connected to D0
    if(_bitCount > 31) // If bit count more than 31, process high bits
    {
        _cardTempHigh |= ((0x80000000 & _cardTemp) >> 31); //	shift value to high bits
        _cardTempHigh <<= 1;
        _cardTemp <<= 1;
    } else {
        _cardTemp <<= 1; // D0 represent binary 0, so just left shift card data
    }
    _lastWiegand = DWT->CYCCNT; // Keep track of last wiegand bit received
}

void WIEGAND::ReadD1() {
    _bitCount++; // Increment bit count for Interrupt connected to D1
    if(_bitCount > 31) // If bit count more than 31, process high bits
    {
        _cardTempHigh |= ((0x80000000 & _cardTemp) >> 31); // shift value to high bits
        _cardTempHigh <<= 1;
        _cardTemp |= 1;
        _cardTemp <<= 1;
    } else {
        _cardTemp |= 1; // D1 represent binary 1, so OR card data with 1 then
        _cardTemp <<= 1; // left shift card data
    }
    _lastWiegand = DWT->CYCCNT; // Keep track of last wiegand bit received
}

unsigned long WIEGAND::GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength) {
    if(bitlength == 26) // EM tag
        return (*codelow & 0x1FFFFFE) >> 1;

    if(bitlength == 24) return (*codelow & 0x7FFFFE) >> 1;

    if(bitlength == 34) // Mifare
    {
        *codehigh = *codehigh & 0x03; // only need the 2 LSB of the codehigh
        *codehigh <<= 30; // shift 2 LSB to MSB
        *codelow >>= 1;
        return *codehigh | *codelow;
    }

    if(bitlength == 32) {
        return (*codelow & 0x7FFFFFFE) >> 1;
    }

    return *codelow; // EM tag or Mifare without parity bits
}

char translateEnterEscapeKeyPress(char originalKeyPress) {
    switch(originalKeyPress) {
    case 0x0b: // 11 or * key
        return 0x0d; // 13 or ASCII ENTER

    case 0x0a: // 10 or # key
        return 0x1b; // 27 or ASCII ESCAPE

    default:
        return originalKeyPress;
    }
}

bool WIEGAND::DoWiegandConversion() {
    unsigned long cardID;
    unsigned long sysTick = DWT->CYCCNT;

    if((sysTick - _lastWiegand) >
       (25 * clocks_in_ms)) // if no more signal coming through after 25ms
    {
        if((_bitCount == 24) || (_bitCount == 26) || (_bitCount == 32) || (_bitCount == 34) ||
           (_bitCount == 37) || (_bitCount == 40) || (_bitCount == 8) ||
           (_bitCount ==
            4)) // bitCount for keypress=4 or 8, Wiegand 26=24 or 26, Wiegand 34=32 or 34
        {
            _codeHigh = 0;
            // shift right 1 bit to get back the real value - interrupt done 1 left shift in advance
            _cardTemp >>= 1;
            // bit count more than 32 bits, shift high bits right to make adjustment
            if(_bitCount > 32) _cardTempHigh >>= 1;

            if(_bitCount == 8) // keypress wiegand with integrity
            {
                // 8-bit Wiegand keyboard data, high nibble is the "NOT" of low nibble
                // eg if key 1 pressed, data=E1 in binary 11100001 , high nibble=1110 , low nibble = 0001
                char highNibble = (_cardTemp & 0xf0) >> 4;
                char lowNibble = (_cardTemp & 0x0f);
                _wiegandType = _bitCount;
                _bitCount = 0;
                _cardTemp = 0;
                _cardTempHigh = 0;

                if(lowNibble ==
                   (~highNibble & 0x0f)) // check if low nibble matches the "NOT" of high nibble.
                {
                    _code = (int)translateEnterEscapeKeyPress(lowNibble);
                    return true;
                } else {
                    _lastWiegand = sysTick;
                    return false;
                }

                // TODO FL-3490: Handle validation failure case!
            } else if(4 == _bitCount) {
                // 4-bit Wiegand codes have no data integrity check so we just
                // read the LOW nibble.
                _code = (int)translateEnterEscapeKeyPress(_cardTemp & 0x0000000F);

                _wiegandType = _bitCount;
                _bitCount = 0;
                _cardTemp = 0;
                _cardTempHigh = 0;

                return true;
            } else if(40 == _bitCount) {
                _cardTempHigh >>= 1;

                _code = _cardTemp;
                _codeHigh = _cardTempHigh;

                _wiegandType = _bitCount;
                _bitCount = 0;
                _cardTemp = 0;
                _cardTempHigh = 0;

                return true;
            } else {
                // wiegand 26 or wiegand 34
                cardID = GetCardId(&_cardTempHigh, &_cardTemp, _bitCount);
                _wiegandType = _bitCount;
                _bitCount = 0;
                _cardTemp = 0;
                _cardTempHigh = 0;
                _code = cardID;
                return true;
            }
        } else {
            // well time over 25 ms and bitCount !=8 , !=26, !=34 , must be noise or nothing then.
            _lastWiegand = sysTick;
            _bitCount = 0;
            _cardTemp = 0;
            _cardTempHigh = 0;
            return false;
        }
    } else
        return false;
}


================================================
FILE: applications/debug/accessor/helpers/wiegand.h
================================================
#pragma once

class WIEGAND {
public:
    WIEGAND(void);
    void begin(void);
    void end(void);
    bool available(void);
    unsigned long getCode(void);
    unsigned long getCodeHigh(void);
    int getWiegandType(void);

    static void ReadD0(void);
    static void ReadD1(void);

private:
    static bool DoWiegandConversion(void);
    static unsigned long
        GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength);

    static unsigned long _cardTempHigh;
    static unsigned long _cardTemp;
    static unsigned long _lastWiegand;
    static int _bitCount;
    static int _wiegandType;
    static unsigned long _code;
    static unsigned long _codeHigh;
};


================================================
FILE: applications/debug/accessor/scene/accessor_scene_generic.h
================================================
#pragma once
#include "../accessor_app.h"

class AccessorApp;

class AccessorScene {
public:
    virtual void on_enter(AccessorApp* app) = 0;
    virtual bool on_event(AccessorApp* app, AccessorEvent* event) = 0;
    virtual void on_exit(AccessorApp* app) = 0;

private:
};


================================================
FILE: applications/debug/accessor/scene/accessor_scene_start.cpp
================================================
#include "../accessor_app.h"
#include "../accessor_view_manager.h"
#include "../accessor_event.h"
#include "accessor_scene_start.h"

void AccessorSceneStart::on_enter(AccessorApp* app) {
    AccessorAppViewManager* view_manager = app->get_view_manager();
    Popup* popup = view_manager->get_popup();

    popup_set_header(popup, "Accessor App", 64, 16, AlignCenter, AlignBottom);
    app->set_text_store("[??????]");
    popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop);

    view_manager->switch_to(AccessorAppViewManager::ViewType::Popup);
}

bool AccessorSceneStart::on_event(AccessorApp* app, AccessorEvent* event) {
    bool consumed = false;

    if(event->type == AccessorEvent::Type::Tick) {
        WIEGAND* wiegand = app->get_wiegand();
        Popup* popup = app->get_view_manager()->get_popup();
        OneWireHost* onewire_host = app->get_one_wire();

        uint8_t data[8] = {0, 0, 0, 0, 0, 0, 0, 0};
        uint8_t type = 0;

        if(wiegand->available()) {
            type = wiegand->getWiegandType();

            for(uint8_t i = 0; i < 4; i++) {
                data[i] = wiegand->getCode() >> (i * 8);
            }

            for(uint8_t i = 4; i < 8; i++) {
                data[i] = wiegand->getCodeHigh() >> ((i - 4) * 8);
            }
        } else {
            FURI_CRITICAL_ENTER();
            if(onewire_host_reset(onewire_host)) {
                type = 255;
                onewire_host_write(onewire_host, 0x33);
                for(uint8_t i = 0; i < 8; i++) {
                    data[i] = onewire_host_read(onewire_host);
                }

                for(uint8_t i = 0; i < 7; i++) {
                    data[i] = data[i + 1];
                }
            }
            FURI_CRITICAL_EXIT();
        }

        if(type > 0) {
            if(type == 255) {
                app->set_text_store(
                    "[%02X %02X %02X %02X %02X %02X DS]",
                    data[5],
                    data[4],
                    data[3],
                    data[2],
                    data[1],
                    data[0]);
            } else {
                app->set_text_store(
                    "[%02X %02X %02X %02X %02X %02X W%u]",
                    data[5],
                    data[4],
                    data[3],
                    data[2],
                    data[1],
                    data[0],
                    type);
            }
            popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop);
            app->notify_success();
        }
    }

    return consumed;
}

void AccessorSceneStart::on_exit(AccessorApp* app) {
    Popup* popup = app->get_view_manager()->get_popup();
    popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom);
    popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop);
}


================================================
FILE: applications/debug/accessor/scene/accessor_scene_start.h
================================================
#pragma once
#include "accessor_scene_generic.h"

class AccessorSceneStart : public AccessorScene {
public:
    void on_enter(AccessorApp* app) final;
    bool on_event(AccessorApp* app, AccessorEvent* event) final;
    void on_exit(AccessorApp* app) final;
};


================================================
FILE: applications/debug/application.fam
================================================
App(
    appid="debug_apps",
    name="Basic debug apps bundle",
    apptype=FlipperAppType.METAPACKAGE,
    provides=[
        "blink_test",
        "vibro_test",
        "keypad_test",
        "usb_test",
        "usb_mouse",
        "uart_echo",
        "display_test",
        "text_box_test",
        "file_browser_test",
        "speaker_debug",
    ],
)


================================================
FILE: applications/debug/battery_test_app/application.fam
================================================
App(
    appid="battery_test",
    name="Battery Test",
    apptype=FlipperAppType.DEBUG,
    entry_point="battery_test_app",
    requires=[
        "gui",
        "power",
    ],
    stack_size=1 * 1024,
    fap_category="Debug",
    fap_libs=["assets"],
)


================================================
FILE: applications/debug/battery_test_app/battery_test_app.c
================================================
#include "battery_test_app.h"

#include <notification/notification_messages.h>

void battery_test_dialog_callback(DialogExResult result, void* context) {
    furi_assert(context);
    BatteryTestApp* app = context;
    if(result == DialogExResultLeft) {
        view_dispatcher_stop(app->view_dispatcher);
    } else if(result == DialogExResultRight) {
        view_dispatcher_switch_to_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo);
    }
}

uint32_t battery_test_exit_confirm_view(void* context) {
    UNUSED(context);
    return BatteryTestAppViewExitDialog;
}

static void battery_test_battery_info_update_model(void* context) {
    BatteryTestApp* app = context;
    power_get_info(app->power, &app->info);
    BatteryInfoModel battery_info_data = {
        .vbus_voltage = app->info.voltage_vbus,
        .gauge_voltage = app->info.voltage_gauge,
        .gauge_current = app->info.current_gauge,
        .gauge_temperature = app->info.temperature_gauge,
        .charge = app->info.charge,
        .health = app->info.health,
    };
    battery_info_set_data(app->battery_info, &battery_info_data);
    notification_message(app->notifications, &sequence_display_backlight_on);
}

BatteryTestApp* battery_test_alloc(void) {
    BatteryTestApp* app = malloc(sizeof(BatteryTestApp));

    // Records
    app->gui = furi_record_open(RECORD_GUI);
    app->power = furi_record_open(RECORD_POWER);
    app->notifications = furi_record_open(RECORD_NOTIFICATION);

    // View dispatcher
    app->view_dispatcher = view_dispatcher_alloc();
    view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
    view_dispatcher_set_tick_event_callback(
        app->view_dispatcher, battery_test_battery_info_update_model, 500);
    view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);

    // Views
    app->battery_info = battery_info_alloc();
    view_set_previous_callback(
        battery_info_get_view(app->battery_info), battery_test_exit_confirm_view);
    view_dispatcher_add_view(
        app->view_dispatcher,
        BatteryTestAppViewBatteryInfo,
        battery_info_get_view(app->battery_info));

    app->dialog = dialog_ex_alloc();
    dialog_ex_set_header(app->dialog, "Close Battery Test?", 64, 12, AlignCenter, AlignTop);
    dialog_ex_set_left_button_text(app->dialog, "Exit");
    dialog_ex_set_right_button_text(app->dialog, "Stay");
    dialog_ex_set_result_callback(app->dialog, battery_test_dialog_callback);
    dialog_ex_set_context(app->dialog, app);

    view_dispatcher_add_view(
        app->view_dispatcher, BatteryTestAppViewExitDialog, dialog_ex_get_view(app->dialog));

    battery_test_battery_info_update_model(app);
    view_dispatcher_switch_to_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo);
    return app;
}

void battery_test_free(BatteryTestApp* app) {
    furi_assert(app);

    // Views
    view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo);
    battery_info_free(app->battery_info);
    view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewExitDialog);
    dialog_ex_free(app->dialog);
    // View dispatcher
    view_dispatcher_free(app->view_dispatcher);
    // Records
    furi_record_close(RECORD_POWER);
    furi_record_close(RECORD_GUI);
    furi_record_close(RECORD_NOTIFICATION);
    free(app);
}

int32_t battery_test_app(void* p) {
    UNUSED(p);
    BatteryTestApp* app = battery_test_alloc();
    // Disable battery low level notification
    power_enable_low_battery_level_notification(app->power, false);

    view_dispatcher_run(app->view_dispatcher);
    power_enable_low_battery_level_notification(app->power, true);
    battery_test_free(app);
    return 0;
}


================================================
FILE: applications/debug/battery_test_app/battery_test_app.h
================================================
#include <furi.h>
#include <power/power_service/power.h>
#include <gui/gui.h>
#include <gui/view.h>
#include <gui/view_dispatcher.h>
#include <notification/notification.h>

#include <gui/modules/dialog_ex.h>
// FIXME
#include "../settings/power_settings_app/views/battery_info.h"

typedef struct {
    Power* power;
    Gui* gui;
    NotificationApp* notifications;
    ViewDispatcher* view_dispatcher;
    BatteryInfo* battery_info;
    DialogEx* dialog;
    PowerInfo info;
} BatteryTestApp;

typedef enum {
    BatteryTestAppViewBatteryInfo,
    BatteryTestAppViewExitDialog,
} BatteryTestAppView;


================================================
FILE: applications/debug/battery_test_app/views/battery_info.c
================================================
#include "battery_info.h"
#include <furi.h>
#include <gui/elements.h>
#include <assets_icons.h>

#define LOW_CHARGE_THRESHOLD         10
#define HIGH_DRAIN_CURRENT_THRESHOLD 100

struct BatteryInfo {
    View* view;
};

static void draw_stat(Canvas* canvas, int x, int y, const Icon* icon, char* val) {
    canvas_draw_frame(canvas, x - 7, y + 7, 30, 13);
    canvas_draw_icon(canvas, x, y, icon);
    canvas_set_color(canvas, ColorWhite);
    canvas_draw_box(canvas, x - 4, y + 16, 24, 6);
    canvas_set_color(canvas, ColorBlack);
    canvas_draw_str_aligned(canvas, x + 8, y + 22, AlignCenter, AlignBottom, val);
}

static void draw_battery(Canvas* canvas, BatteryInfoModel* data, int x, int y) {
    char emote[20] = {};
    char header[20] = {};
    char value[20] = {};

    int32_t drain_current = data->gauge_current * (-1000);
    uint32_t charge_current = data->gauge_current * 1000;

    // Draw battery
    canvas_draw_icon(canvas, x, y, &I_BatteryBody_52x28);
    if(charge_current > 0) {
        canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceCharging_29x14);
    } else if(drain_current > HIGH_DRAIN_CURRENT_THRESHOLD) {
        canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceConfused_29x14);
    } else if(data->charge < LOW_CHARGE_THRESHOLD) {
        canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceNopower_29x14);
    } else {
        canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceNormal_29x14);
    }

    // Draw bubble
    elements_bubble(canvas, 53, 0, 71, 39);

    // Set text
    if(charge_current > 0) {
        snprintf(emote, sizeof(emote), "%s", "Yummy!");
        snprintf(header, sizeof(header), "%s", "Charging at");
        snprintf(
            value,
            sizeof(value),
            "%lu.%luV   %lumA",
            (uint32_t)(data->vbus_voltage),
            (uint32_t)(data->vbus_voltage * 10) % 10,
            charge_current);
    } else if(drain_current > 0) {
        snprintf(
            emote,
            sizeof(emote),
            "%s",
            drain_current > HIGH_DRAIN_CURRENT_THRESHOLD ? "Oh no!" : "Om-nom-nom!");
        snprintf(header, sizeof(header), "%s", "Consumption is");
        snprintf(
            value,
            sizeof(value),
            "%ld %s",
            drain_current,
            drain_current > HIGH_DRAIN_CURRENT_THRESHOLD ? "mA!" : "mA");
    } else if(drain_current != 0) {
        snprintf(header, 20, "...");
    } else if(data->charging_voltage < 4.2f) {
        // Non-default battery charging limit, mention it
        snprintf(emote, sizeof(emote), "Charged!");
        snprintf(header, sizeof(header), "Limited to");
        snprintf(
            value,
            sizeof(value),
            "%lu.%luV",
            (uint32_t)(data->charging_voltage),
            (uint32_t)(data->charging_voltage * 10) % 10);
    } else {
        snprintf(header, sizeof(header), "Charged!");
    }

    canvas_draw_str_aligned(canvas, 92, y + 3, AlignCenter, AlignCenter, emote);
    canvas_draw_str_aligned(canvas, 92, y + 15, AlignCenter, AlignCenter, header);
    canvas_draw_str_aligned(canvas, 92, y + 27, AlignCenter, AlignCenter, value);
}

static void battery_info_draw_callback(Canvas* canvas, void* context) {
    furi_assert(context);
    BatteryInfoModel* model = context;

    canvas_clear(canvas);
    canvas_set_color(canvas, ColorBlack);
    draw_battery(canvas, model, 0, 5);

    char batt_level[10];
    char temperature[10];
    char voltage[10];
    char health[10];

    snprintf(batt_level, sizeof(batt_level), "%lu%%", (uint32_t)model->charge);
    snprintf(temperature, sizeof(temperature), "%lu C", (uint32_t)model->gauge_temperature);
    snprintf(
        voltage,
        sizeof(voltage),
        "%lu.%01lu V",
        (uint32_t)model->gauge_voltage,
        (uint32_t)(model->gauge_voltage * 10) % 10UL);
    snprintf(health, sizeof(health), "%d%%", model->health);

    draw_stat(canvas, 8, 42, &I_Battery_16x16, batt_level);
    draw_stat(canvas, 40, 42, &I_Temperature_16x16, temperature);
    draw_stat(canvas, 72, 42, &I_Voltage_16x16, voltage);
    draw_stat(canvas, 104, 42, &I_Health_16x16, health);
}

BatteryInfo* battery_info_alloc(void) {
    BatteryInfo* battery_info = malloc(sizeof(BatteryInfo));
    battery_info->view = view_alloc();
    view_set_context(battery_info->view, battery_info);
    view_allocate_model(battery_info->view, ViewModelTypeLocking, sizeof(BatteryInfoModel));
    view_set_draw_callback(battery_info->view, battery_info_draw_callback);

    return battery_info;
}

void battery_info_free(BatteryInfo* battery_info) {
    furi_assert(battery_info);
    view_free(battery_info->view);
    free(battery_info);
}

View* battery_info_get_view(BatteryInfo* battery_info) {
    furi_assert(battery_info);
    return battery_info->view;
}

void battery_info_set_data(BatteryInfo* battery_info, BatteryInfoModel* data) {
    furi_assert(battery_info);
    furi_assert(data);
    with_view_model(
        battery_info->view,
        BatteryInfoModel * model,
        { memcpy(model, data, sizeof(BatteryInfoModel)); },
        true);
}


================================================
FILE: applications/debug/battery_test_app/views/battery_info.h
================================================
#pragma once

#include <gui/view.h>

typedef struct BatteryInfo BatteryInfo;

typedef struct {
    float vbus_voltage;
    float gauge_voltage;
    float gauge_current;
    float gauge_temperature;
    float charging_voltage;
    uint8_t charge;
    uint8_t health;
} BatteryInfoModel;

BatteryInfo* battery_info_alloc(void);

void battery_info_free(BatteryInfo* battery_info);

View* battery_info_get_view(BatteryInfo* battery_info);

void battery_info_set_data(BatteryInfo* battery_info, BatteryInfoModel* data);


================================================
FILE: applications/debug/blink_test/application.fam
================================================
App(
    appid="blink_test",
    name="Blink Test",
    apptype=FlipperAppType.DEBUG,
    entry_point="blink_test_app",
    requires=["gui"],
    stack_size=1 * 1024,
    fap_category="Debug",
)


================================================
FILE: applications/debug/blink_test/blink_test.c
================================================
#include <furi.h>
#include <furi_hal.h>

#include <gui/gui.h>
#include <input/input.h>

#include <notification/notification_messages.h>

typedef enum {
    BlinkEventTypeTick,
    BlinkEventTypeInput,
} BlinkEventType;

typedef struct {
    BlinkEventType type;
    InputEvent input;
} BlinkEvent;

static const NotificationSequence blink_test_sequence_hw_blink_start_red = {
    &message_blink_start_10,
    &message_blink_set_color_red,
    &message_do_not_reset,
    NULL,
};

static const NotificationSequence blink_test_sequence_hw_blink_green = {
    &message_blink_set_color_green,
    NULL,
};

static const NotificationSequence blink_test_sequence_hw_blink_blue = {
    &message_blink_set_color_blue,
    NULL,
};

static const NotificationSequence blink_test_sequence_hw_blink_stop = {
    &message_blink_stop,
    NULL,
};

static const NotificationSequence* blink_test_colors[] = {
    &sequence_blink_red_100,
    &sequence_blink_green_100,
    &sequence_blink_blue_100,
    &sequence_blink_yellow_100,
    &sequence_blink_cyan_100,
    &sequence_blink_magenta_100,
    &sequence_blink_white_100,
    &blink_test_sequence_hw_blink_start_red,
    &blink_test_sequence_hw_blink_green,
    &blink_test_sequence_hw_blink_blue,
    &blink_test_sequence_hw_blink_stop,
};

static void blink_test_update(void* ctx) {
    furi_assert(ctx);
    FuriMessageQueue* event_queue = ctx;
    BlinkEvent event = {.type = BlinkEventTypeTick};
    // It's OK to loose this event if system overloaded
    furi_message_queue_put(event_queue, &event, 0);
}

static void blink_test_draw_callback(Canvas* canvas, void* ctx) {
    UNUSED(ctx);
    canvas_clear(canvas);
    canvas_set_font(canvas, FontPrimary);
    canvas_draw_str(canvas, 2, 10, "Blink application");
}

static void blink_test_input_callback(InputEvent* input_event, void* ctx) {
    furi_assert(ctx);
    FuriMessageQueue* event_queue = ctx;

    BlinkEvent event = {.type = BlinkEventTypeInput, .input = *input_event};
    furi_message_queue_put(event_queue, &event, FuriWaitForever);
}

int32_t blink_test_app(void* p) {
    UNUSED(p);
    FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(BlinkEvent));

    // Configure view port
    ViewPort* view_port = view_port_alloc();
    view_port_draw_callback_set(view_port, blink_test_draw_callback, NULL);
    view_port_input_callback_set(view_port, blink_test_input_callback, event_queue);
    FuriTimer* timer = furi_timer_alloc(blink_test_update, FuriTimerTypePeriodic, event_queue);
    furi_timer_start(timer, furi_kernel_get_tick_frequency());

    // Register view port in GUI
    Gui* gui = furi_record_open(RECORD_GUI);
    gui_add_view_port(gui, view_port, GuiLayerFullscreen);

    NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION);

    uint8_t state = 0;
    BlinkEvent event;

    while(1) {
        furi_check(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk);
        if(event.type == BlinkEventTypeInput) {
            if((event.input.type == InputTypeShort) && (event.input.key == InputKeyBack)) {
                break;
            }
        } else {
            notification_message(notifications, blink_test_colors[state]);
            state++;
            if(state >= COUNT_OF(blink_test_colors)) {
                state = 0;
            }
        }
    }

    notification_message(notifications, &blink_test_sequence_hw_blink_stop);

    furi_timer_free(timer);

    gui_remove_view_port(gui, view_port);
    view_port_free(view_port);
    furi_message_queue_free(event_queue);

    furi_record_close(RECORD_NOTIFICATION);
    furi_record_close(RECORD_GUI);

    return 0;
}


================================================
FILE: applications/debug/bt_debug_app/application.fam
================================================
App(
    appid="bt_debug",
    name="Bluetooth Debug",
    apptype=FlipperAppType.DEBUG,
    entry_point="bt_debug_app",
    cdefines=["SRV_BT"],
    requires=[
        "bt",
        "gui",
        "dialogs",
    ],
    provides=[
        "bt_debug",
    ],
    stack_size=1 * 1024,
    fap_category="Debug",
)


================================================
FILE: applications/debug/bt_debug_app/bt_debug_app.c
================================================
#include "bt_debug_app.h"
#include <furi_hal_bt.h>

#define TAG "BtDebugApp"

enum BtDebugSubmenuIndex {
    BtDebugSubmenuIndexCarrierTest,
    BtDebugSubmenuIndexPacketTest,
};

void bt_debug_submenu_callback(void* context, uint32_t index) {
    furi_assert(context);
    BtDebugApp* app = context;
    if(index == BtDebugSubmenuIndexCarrierTest) {
        view_dispatcher_switch_to_view(app->view_dispatcher, BtDebugAppViewCarrierTest);
    } else if(index == BtDebugSubmenuIndexPacketTest) {
        view_dispatcher_switch_to_view(app->view_dispatcher, BtDebugAppViewPacketTest);
    }
}

uint32_t bt_debug_exit(void* context) {
    UNUSED(context);
    return VIEW_NONE;
}

uint32_t bt_debug_start_view(void* context) {
    UNUSED(context);
    return BtDebugAppViewSubmenu;
}

BtDebugApp* bt_debug_app_alloc(void) {
    BtDebugApp* app = malloc(sizeof(BtDebugApp));

    // Gui
    app->gui = furi_record_open(RECORD_GUI);

    // View dispatcher
    app->view_dispatcher = view_dispatcher_alloc();
    view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);

    // Views
    app->submenu = submenu_alloc();
    submenu_add_item(
        app->submenu,
        "Carrier test",
        BtDebugSubmenuIndexCarrierTest,
        bt_debug_submenu_callback,
        app);
    submenu_add_item(
        app->submenu, "Packet test", BtDebugSubmenuIndexPacketTest, bt_debug_submenu_callback, app);
    view_set_previous_callback(submenu_get_view(app->submenu), bt_debug_exit);
    view_dispatcher_add_view(
        app->view_dispatcher, BtDebugAppViewSubmenu, submenu_get_view(app->submenu));
    app->bt_carrier_test = bt_carrier_test_alloc();
    view_set_previous_callback(
        bt_carrier_test_get_view(app->bt_carrier_test), bt_debug_start_view);
    view_dispatcher_add_view(
        app->view_dispatcher,
        BtDebugAppViewCarrierTest,
        bt_carrier_test_get_view(app->bt_carrier_test));
    app->bt_packet_test = bt_packet_test_alloc();
    view_set_previous_callback(bt_packet_test_get_view(app->bt_packet_test), bt_debug_start_view);
    view_dispatcher_add_view(
        app->view_dispatcher,
        BtDebugAppViewPacketTest,
        bt_packet_test_get_view(app->bt_packet_test));

    // Switch to menu
    view_dispatcher_switch_to_view(app->view_dispatcher, BtDebugAppViewSubmenu);

    return app;
}

void bt_debug_app_free(BtDebugApp* app) {
    furi_assert(app);

    // Free views
    view_dispatcher_remove_view(app->view_dispatcher, BtDebugAppViewSubmenu);
    submenu_free(app->submenu);
    view_dispatcher_remove_view(app->view_dispatcher, BtDebugAppViewCarrierTest);
    bt_carrier_test_free(app->bt_carrier_test);
    view_dispatcher_remove_view(app->view_dispatcher, BtDebugAppViewPacketTest);
    bt_packet_test_free(app->bt_packet_test);
    view_dispatcher_free(app->view_dispatcher);

    // Close gui record
    furi_record_close(RECORD_GUI);
    app->gui = NULL;

    // Free rest
    free(app);
}

int32_t bt_debug_app(void* p) {
    UNUSED(p);
    if(!furi_hal_bt_is_testing_supported()) {
        FURI_LOG_E(TAG, "Incorrect radio stack: radio testing features are absent.");
        DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
        dialog_message_show_storage_error(dialogs, "Incorrect\nRadioStack");
        return 255;
    }

    BtDebugApp* app = bt_debug_app_alloc();
    // Was bt active?
    const bool was_active = furi_hal_bt_is_active();
    // Stop advertising
    furi_hal_bt_stop_advertising();

    view_dispatcher_run(app->view_dispatcher);

    // Restart advertising
    if(was_active) {
        furi_hal_bt_start_advertising();
    }
    bt_debug_app_free(app);
    return 0;
}


================================================
FILE: applications/debug/bt_debug_app/bt_debug_app.h
================================================
#pragma once

#include <furi.h>
#include <gui/gui.h>
#include <gui/view.h>
#include <gui/view_dispatcher.h>
#include <gui/modules/submenu.h>

#include <dialogs/dialogs.h>

#include "views/bt_carrier_test.h"
#include "views/bt_packet_test.h"

typedef struct {
    Gui* gui;
    ViewDispatcher* view_dispatcher;
    Submenu* submenu;
    BtCarrierTest* bt_carrier_test;
    BtPacketTest* bt_packet_test;
} BtDebugApp;

typedef enum {
    BtDebugAppViewSubmenu,
    BtDebugAppViewCarrierTest,
    BtDebugAppViewPacketTest,
} BtDebugAppView;


================================================
FILE: applications/debug/bt_debug_app/views/bt_carrier_test.c
================================================
#include "bt_carrier_test.h"
#include "bt_test.h"
#include "bt_test_types.h"
#include <furi_hal_bt.h>

struct BtCarrierTest {
    BtTest* bt_test;
    BtTestParam* bt_param_channel;
    BtTestMode mode;
    BtTestChannel channel;
    BtTestPower power;
    FuriTimer* timer;
};

static BtTestParamValue bt_param_mode[] = {
    {.value = BtTestModeRx, .str = "Rx"},
    {.value = BtTestModeTx, .str = "Tx"},
    {.value = BtTestModeTxHopping, .str = "Hopping Tx"},
};

static BtTestParamValue bt_param_channel[] = {
    {.value = BtTestChannel2402, .str = "2402 MHz"},
    {.value = BtTestChannel2440, .str = "2440 MHz"},
    {.value = BtTestChannel2480, .str = "2480 MHz"},
};

static BtTestParamValue bt_param_power[] = {
    {.value = BtPower0dB, .str = "0 dB"},
    {.value = BtPower2dB, .str = "2 dB"},
    {.value = BtPower4dB, .str = "4 dB"},
    {.value = BtPower6dB, .str = "6 dB"},
};

static void bt_carrier_test_start(BtCarrierTest* bt_carrier_test) {
    furi_assert(bt_carrier_test);
    if(bt_carrier_test->mode == BtTestModeRx) {
        furi_hal_bt_start_packet_rx(bt_carrier_test->channel, 1);
        furi_timer_start(bt_carrier_test->timer, furi_kernel_get_tick_frequency() / 4);
    } else if(bt_carrier_test->mode == BtTestModeTxHopping) {
        furi_hal_bt_start_tone_tx(bt_carrier_test->channel, bt_carrier_test->power);
        furi_timer_start(bt_carrier_test->timer, furi_kernel_get_tick_frequency() * 2);
    } else if(bt_carrier_test->mode == BtTestModeTx) {
        furi_hal_bt_start_tone_tx(bt_carrier_test->channel, bt_carrier_test->power);
    }
}

static void bt_carrier_test_switch_channel(BtCarrierTest* bt_carrier_test) {
    furi_assert(bt_carrier_test);
    furi_hal_bt_stop_tone_tx();
    uint8_t channel_i = 0;
    if(bt_carrier_test->channel == BtTestChannel2402) {
        bt_carrier_test->channel = BtTestChannel2440;
        channel_i = 1;
    } else if(bt_carrier_test->channel == BtTestChannel2440) {
        bt_carrier_test->channel = BtTestChannel2480;
        channel_i = 2;
    } else if(bt_carrier_test->channel == BtTestChannel2480) {
        bt_carrier_test->channel = BtTestChannel2402;
        channel_i = 0;
    }
    furi_hal_bt_start_tone_tx(bt_carrier_test->channel, bt_carrier_test->power);
    bt_test_set_current_value_index(bt_carrier_test->bt_param_channel, channel_i);
    bt_test_set_current_value_text(
        bt_carrier_test->bt_param_channel, bt_param_channel[channel_i].str);
}

static void bt_carrier_test_stop(BtCarrierTest* bt_carrier_test) {
    furi_assert(bt_carrier_test);
    if(bt_carrier_test->mode == BtTestModeTxHopping) {
        furi_hal_bt_stop_tone_tx();
        furi_timer_stop(bt_carrier_test->timer);
    } else if(bt_carrier_test->mode == BtTestModeTx) {
        furi_hal_bt_stop_tone_tx();
    } else if(bt_carrier_test->mode == BtTestModeRx) {
        furi_hal_bt_stop_packet_test();
        furi_timer_stop(bt_carrier_test->timer);
    }
}

static uint32_t bt_carrier_test_param_changed(BtTestParam* param, BtTestParamValue* param_val) {
    furi_assert(param);
    uint8_t index = bt_test_get_current_value_index(param);
    bt_test_set_current_value_text(param, param_val[index].str);
    return param_val[index].value;
}

static void bt_carrier_test_mode_changed(BtTestParam* param) {
    BtCarrierTest* bt_carrier_test = bt_test_get_context(param);
    bt_carrier_test_stop(bt_carrier_test);
    bt_carrier_test->mode = bt_carrier_test_param_changed(param, bt_param_mode);
}

static void bt_carrier_test_channel_changed(BtTestParam* param) {
    BtCarrierTest* bt_carrier_test = bt_test_get_context(param);
    bt_carrier_test_stop(bt_carrier_test);
    bt_carrier_test->channel = bt_carrier_test_param_changed(param, bt_param_channel);
}

static void bt_carrier_test_param_channel(BtTestParam* param) {
    BtCarrierTest* bt_carrier_test = bt_test_get_context(param);
    bt_carrier_test_stop(bt_carrier_test);
    bt_carrier_test->power = bt_carrier_test_param_changed(param, bt_param_power);
}

static void bt_carrier_test_change_state_callback(BtTestState state, void* context) {
    furi_assert(context);
    BtCarrierTest* bt_carrier_test = context;
    furi_hal_bt_stop_tone_tx();
    if(state == BtTestStateStarted) {
        bt_carrier_test_start(bt_carrier_test);
    } else if(state == BtTestStateStopped) {
        bt_carrier_test_stop(bt_carrier_test);
    }
}

static void bt_carrier_test_exit_callback(void* context) {
    furi_assert(context);
    BtCarrierTest* bt_carrier_test = context;
    bt_carrier_test_stop(bt_carrier_test);
}

static void bt_test_carrier_timer_callback(void* context) {
    furi_assert(context);
    BtCarrierTest* bt_carrier_test = context;
    if(bt_carrier_test->mode == BtTestModeRx) {
        bt_test_set_rssi(bt_carrier_test->bt_test, furi_hal_bt_get_rssi());
    } else if(bt_carrier_test->mode == BtTestModeTxHopping) {
        bt_carrier_test_switch_channel(bt_carrier_test);
    }
}

BtCarrierTest* bt_carrier_test_alloc(void) {
    BtCarrierTest* bt_carrier_test = malloc(sizeof(BtCarrierTest));
    bt_carrier_test->bt_test = bt_test_alloc();
    bt_test_set_context(bt_carrier_test->bt_test, bt_carrier_test);
    bt_test_set_change_state_callback(
        bt_carrier_test->bt_test, bt_carrier_test_change_state_callback);
    bt_test_set_back_callback(bt_carrier_test->bt_test, bt_carrier_test_exit_callback);

    BtTestParam* param;
    param = bt_test_param_add(
        bt_carrier_test->bt_test,
        "Mode",
        COUNT_OF(bt_param_mode),
        bt_carrier_test_mode_changed,
        bt_carrier_test);
    bt_test_set_current_value_index(param, 0);
    bt_test_set_current_value_text(param, bt_param_mode[0].str);
    bt_carrier_test->mode = BtTestModeRx;

    param = bt_test_param_add(
        bt_carrier_test->bt_test,
        "Channel",
        COUNT_OF(bt_param_channel),
        bt_carrier_test_channel_changed,
        bt_carrier_test);
    bt_test_set_current_value_index(param, 0);
    bt_test_set_current_value_text(param, bt_param_channel[0].str);
    bt_carrier_test->channel = BtTestChannel2402;
    bt_carrier_test->bt_param_channel = param;

    param = bt_test_param_add(
        bt_carrier_test->bt_test,
        "Power",
        COUNT_OF(bt_param_power),
        bt_carrier_test_param_channel,
        bt_carrier_test);
    bt_test_set_current_value_index(param, 0);
    bt_test_set_current_value_text(param, bt_param_power[0].str);
    bt_carrier_test->power = BtPower0dB;

    bt_carrier_test->timer =
        furi_timer_alloc(bt_test_carrier_timer_callback, FuriTimerTypePeriodic, bt_carrier_test);

    return bt_carrier_test;
}

void bt_carrier_test_free(BtCarrierTest* bt_carrier_test) {
    furi_assert(bt_carrier_test);
    bt_test_free(bt_carrier_test->bt_test);
    furi_timer_free(bt_carrier_test->timer);
    free(bt_carrier_test);
}

View* bt_carrier_test_get_view(BtCarrierTest* bt_carrier_test) {
    furi_assert(bt_carrier_test);
    return bt_test_get_view(bt_carrier_test->bt_test);
}


================================================
FILE: applications/debug/bt_debug_app/views/bt_carrier_test.h
================================================
#pragma once
#include <gui/view.h>

typedef struct BtCarrierTest BtCarrierTest;

BtCarrierTest* bt_carrier_test_alloc(void);

void bt_carrier_test_free(BtCarrierTest* bt_carrier_test);

View* bt_carrier_test_get_view(BtCarrierTest* bt_carrier_test);


================================================
FILE: applications/debug/bt_debug_app/views/bt_packet_test.c
================================================
#include "bt_packet_test.h"
#include "bt_test.h"
#include "bt_test_types.h"
#include <furi_hal_bt.h>

struct BtPacketTest {
    BtTest* bt_test;
    BtTestMode mode;
    BtTestChannel channel;
    BtTestDataRate data_rate;
    FuriTimer* timer;
};

static BtTestParamValue bt_param_mode[] = {
    {.value = BtTestModeRx, .str = "Rx"},
    {.value = BtTestModeTx, .str = "Tx"},
};

static BtTestParamValue bt_param_channel[] = {
    {.value = BtTestChannel2402, .str = "2402 MHz"},
    {.value = BtTestChannel2440, .str = "2440 MHz"},
    {.value = BtTestChannel2480, .str = "2480 MHz"},
};

static BtTestParamValue bt_param_data_rate[] = {
    {.value = BtDataRate1M, .str = "1 Mbps"},
    {.value = BtDataRate2M, .str = "2 Mbps"},
};

static void bt_packet_test_start(BtPacketTest* bt_packet_test) {
    furi_assert(bt_packet_test);
    if(bt_packet_test->mode == BtTestModeRx) {
        furi_hal_bt_start_packet_rx(bt_packet_test->channel, bt_packet_test->data_rate);
        furi_timer_start(bt_packet_test->timer, furi_kernel_get_tick_frequency() / 4);
    } else if(bt_packet_test->mode == BtTestModeTx) {
        furi_hal_bt_start_packet_tx(bt_packet_test->channel, 1, bt_packet_test->data_rate);
    }
}

static void bt_packet_test_stop(BtPacketTest* bt_packet_test) {
    furi_assert(bt_packet_test);
    if(bt_packet_test->mode == BtTestModeTx) {
        furi_hal_bt_stop_packet_test();
        bt_test_set_packets_tx(bt_packet_test->bt_test, furi_hal_bt_get_transmitted_packets());
    } else if(bt_packet_test->mode == BtTestModeRx) {
        bt_test_set_packets_rx(bt_packet_test->bt_test, furi_hal_bt_stop_packet_test());
        furi_timer_stop(bt_packet_test->timer);
    }
}

static uint32_t bt_packet_test_param_changed(BtTestParam* param, BtTestParamValue* param_val) {
    furi_assert(param);
    uint8_t index = bt_test_get_current_value_index(param);
    bt_test_set_current_value_text(param, param_val[index].str);
    return param_val[index].value;
}

static void bt_packet_test_mode_changed(BtTestParam* param) {
    BtPacketTest* bt_packet_test = bt_test_get_context(param);
    bt_packet_test_stop(bt_packet_test);
    bt_packet_test->mode = bt_packet_test_param_changed(param, bt_param_mode);
}

static void bt_packet_test_channel_changed(BtTestParam* param) {
    BtPacketTest* bt_packet_test = bt_test_get_context(param);
    bt_packet_test_stop(bt_packet_test);
    bt_packet_test->channel = bt_packet_test_param_changed(param, bt_param_channel);
}

static void bt_packet_test_param_channel(BtTestParam* param) {
    BtPacketTest* bt_packet_test = bt_test_get_context(param);
    bt_packet_test_stop(bt_packet_test);
    bt_packet_test->data_rate = bt_packet_test_param_changed(param, bt_param_data_rate);
}

static void bt_packet_test_change_state_callback(BtTestState state, void* context) {
    furi_assert(context);
    BtPacketTest* bt_packet_test = context;
    if(state == BtTestStateStarted) {
        bt_packet_test_start(bt_packet_test);
    } else if(state == BtTestStateStopped) {
        bt_packet_test_stop(bt_packet_test);
    }
}

static void bt_packet_test_exit_callback(void* context) {
    furi_assert(context);
    BtPacketTest* bt_packet_test = context;
    bt_packet_test_stop(bt_packet_test);
}

static void bt_test_packet_timer_callback(void* context) {
    furi_assert(context);
    BtPacketTest* bt_packet_test = context;
    if(bt_packet_test->mode == BtTestModeRx) {
        bt_test_set_rssi(bt_packet_test->bt_test, furi_hal_bt_get_rssi());
    }
}

BtPacketTest* bt_packet_test_alloc(void) {
    BtPacketTest* bt_packet_test = malloc(sizeof(BtPacketTest));
    bt_packet_test->bt_test = bt_test_alloc();
    bt_test_set_context(bt_packet_test->bt_test, bt_packet_test);
    bt_test_set_change_state_callback(
        bt_packet_test->bt_test, bt_packet_test_change_state_callback);
    bt_test_set_back_callback(bt_packet_test->bt_test, bt_packet_test_exit_callback);

    BtTestParam* param;
    param = bt_test_param_add(
        bt_packet_test->bt_test,
        "Mode",
        COUNT_OF(bt_param_mode),
        bt_packet_test_mode_changed,
        bt_packet_test);
    bt_test_set_current_value_index(param, 0);
    bt_test_set_current_value_text(param, bt_param_mode[0].str);
    bt_packet_test->mode = BtTestModeRx;

    param = bt_test_param_add(
        bt_packet_test->bt_test,
        "Channel",
        COUNT_OF(bt_param_channel),
        bt_packet_test_channel_changed,
        bt_packet_test);
    bt_test_set_current_value_index(param, 0);
    bt_test_set_current_value_text(param, bt_param_channel[0].str);
    bt_packet_test->channel = BtTestChannel2402;

    param = bt_test_param_add(
        bt_packet_test->bt_test,
        "Data rate",
        COUNT_OF(bt_param_data_rate),
        bt_packet_test_param_channel,
        bt_packet_test);
    bt_test_set_current_value_index(param, 0);
    bt_test_set_current_value_text(param, bt_param_data_rate[0].str);
    bt_packet_test->data_rate = BtDataRate1M;

    bt_packet_test->timer =
        furi_timer_alloc(bt_test_packet_timer_callback, FuriTimerTypePeriodic, bt_packet_test);

    return bt_packet_test;
}

void bt_packet_test_free(BtPacketTest* bt_packet_test) {
    furi_assert(bt_packet_test);
    bt_test_free(bt_packet_test->bt_test);
    furi_timer_free(bt_packet_test->timer);
    free(bt_packet_test);
}

View* bt_packet_test_get_view(BtPacketTest* bt_packet_test) {
    furi_assert(bt_packet_test);
    return bt_test_get_view(bt_packet_test->bt_test);
}


================================================
FILE: applications/debug/bt_debug_app/views/bt_packet_test.h
================================================
#pragma once
#include <gui/view.h>

typedef struct BtPacketTest BtPacketTest;

BtPacketTest* bt_packet_test_alloc(void);

void bt_packet_test_free(BtPacketTest* bt_packet_test);

View* bt_packet_test_get_view(BtPacketTest* bt_packet_test);


================================================
FILE: applications/debug/bt_debug_app/views/bt_test.c
================================================
#include "bt_test.h"

#include <gui/canvas.h>
#include <gui/elements.h>

#include <lib/toolbox/float_tools.h>
#include <m-array.h>
#include <furi.h>
#include <inttypes.h>
#include <stdint.h>

struct BtTestParam {
    const char* label;
    uint8_t current_value_index;
    FuriString* current_value_text;
    uint8_t values_count;
    BtTestParamChangeCallback change_callback;
    void* context;
};

ARRAY_DEF(BtTestParamArray, BtTestParam, M_POD_OPLIST); //-V658

struct BtTest {
    View* view;
    BtTestChangeStateCallback change_state_callback;
    BtTestBackCallback back_callback;
    void* context;
};

typedef struct {
    BtTestState state;
    BtTestParamArray_t params;
    uint8_t position;
    uint8_t window_position;
    const char* message;
    float rssi;
    uint32_t packets_num_rx;
    uint32_t packets_num_tx;
} BtTestModel;

#define BT_TEST_START_MESSAGE "Ok - Start"
#define BT_TEST_STOP_MESSAGE  "Ok - Stop"

static void bt_test_process_up(BtTest* bt_test);
static void bt_test_process_down(BtTest* bt_test);
static void bt_test_process_left(BtTest* bt_test);
static void bt_test_process_right(BtTest* bt_test);
static void bt_test_process_ok(BtTest* bt_test);
static void bt_test_process_back(BtTest* bt_test);

static void bt_test_draw_callback(Canvas* canvas, void* _model) {
    BtTestModel* model = _model;
    char info_str[32];

    const uint8_t param_height = 16;
    const uint8_t param_width = 123;

    canvas_clear(canvas);

    uint8_t position = 0;
    BtTestParamArray_it_t it;

    canvas_set_font(canvas, FontSecondary);
    for(BtTestParamArray_it(it, model->params); !BtTestParamArray_end_p(it);
        BtTestParamArray_next(it)) {
        uint8_t param_position = position - model->window_position;
        uint8_t params_on_screen = 3;
        uint8_t y_offset = 0;

        if(param_position < params_on_screen) {
            const BtTestParam* param = BtTestParamArray_cref(it);
            uint8_t param_y = y_offset + (param_position * param_height);
            uint8_t param_text_y = param_y + param_height - 4;

            if(position == model->position) {
                canvas_set_color(canvas, ColorBlack);
                elements_slightly_rounded_box(
                    canvas, 0, param_y + 1, param_width, param_height - 2);
                canvas_set_color(canvas, ColorWhite);
            } else {
                canvas_set_color(canvas, ColorBlack);
            }

            canvas_draw_str(canvas, 6, param_text_y, param->label);

            if(param->current_value_index > 0) {
                canvas_draw_str(canvas, 50, param_text_y, "<");
            }

            canvas_draw_str(
                canvas, 61, param_text_y, furi_string_get_cstr(param->current_value_text));

            if(param->current_value_index < (param->values_count - 1)) {
                canvas_draw_str(canvas, 113, param_text_y, ">");
            }
        }

        position++;
    }

    elements_scrollbar(canvas, model->position, BtTestParamArray_size(model->params));
    canvas_draw_str(canvas, 6, 60, model->message);
    if(model->state == BtTestStateStarted) {
        if(!float_is_equal(model->rssi, 0.0f)) {
            snprintf(info_str, sizeof(info_str), "RSSI:%3.1f dB", (double)model->rssi);
            canvas_draw_str_aligned(canvas, 124, 60, AlignRight, AlignBottom, info_str);
        }
    } else if(model->state == BtTestStateStopped) {
        if(model->packets_num_rx) {
            snprintf(info_str, sizeof(info_str), "%" PRIu32 " pack rcv", model->packets_num_rx);
            canvas_draw_str_aligned(canvas, 124, 60, AlignRight, AlignBottom, info_str);
        } else if(model->packets_num_tx) {
            snprintf(info_str, sizeof(info_str), "%" PRIu32 " pack sent", model->packets_num_tx);
            canvas_draw_str_aligned(canvas, 124, 60, AlignRight, AlignBottom, info_str);
        }
    }
}

static bool bt_test_input_callback(InputEvent* event, void* context) {
    BtTest* bt_test = context;
    furi_assert(bt_test);
    bool consumed = false;

    if(event->type == InputTypeShort) {
        switch(event->key) {
        case InputKeyUp:
            consumed = true;
            bt_test_process_up(bt_test);
            break;
        case InputKeyDown:
            consumed = true;
            bt_test_process_down(bt_test);
            break;
        case InputKeyLeft:
            consumed = true;
            bt_test_process_left(bt_test);
            break;
        case InputKeyRight:
            consumed = true;
            bt_test_process_right(bt_test);
            break;
        case InputKeyOk:
            consumed = true;
            bt_test_process_ok(bt_test);
            break;
        case InputKeyBack:
            consumed = false;
            bt_test_process_back(bt_test);
            break;
        default:
            break;
        }
    }

    return consumed;
}

void bt_test_process_up(BtTest* bt_test) {
    with_view_model( // -V658
        bt_test->view,
        BtTestModel * model,
        {
            uint8_t params_on_screen = 3;
            if(model->position > 0) {
                model->position--;
                if(((model->position - model->window_position) < 1) &&
                   model->window_position > 0) {
                    model->window_position--;
                }
            } else {
                model->position = BtTestParamArray_size(model->params) - 1;
                if(model->position > (params_on_screen - 1)) {
                    model->window_position = model->position - (params_on_screen - 1);
                }
            }
        },
        true);
}

void bt_test_process_down(BtTest* bt_test) {
    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            uint8_t params_on_screen = 3;
            if(model->position < (BtTestParamArray_size(model->params) - 1)) {
                model->position++;
                if((model->position - model->window_position) > (params_on_screen - 2) &&
                   model->window_position <
                       (BtTestParamArray_size(model->params) - params_on_screen)) {
                    model->window_position++;
                }
            } else {
                model->position = 0;
                model->window_position = 0;
            }
        },
        true);
}

BtTestParam* bt_test_get_selected_param(BtTestModel* model) {
    BtTestParam* param = NULL;

    BtTestParamArray_it_t it;
    uint8_t position = 0;
    for(BtTestParamArray_it(it, model->params); !BtTestParamArray_end_p(it);
        BtTestParamArray_next(it)) {
        if(position == model->position) {
            break;
        }
        position++;
    }

    param = BtTestParamArray_ref(it);

    furi_assert(param);
    return param;
}

void bt_test_process_left(BtTest* bt_test) {
    BtTestParam* param;
    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            param = bt_test_get_selected_param(model);
            if(param->current_value_index > 0) {
                param->current_value_index--;
                if(param->change_callback) {
                    model->state = BtTestStateStopped;
                    model->message = BT_TEST_START_MESSAGE;
                    model->rssi = 0.0f;
                    model->packets_num_rx = 0;
                    model->packets_num_tx = 0;
                }
            }
        },
        true);
    if(param->change_callback) {
        param->change_callback(param);
    }
}

void bt_test_process_right(BtTest* bt_test) {
    BtTestParam* param;
    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            param = bt_test_get_selected_param(model);
            if(param->current_value_index < (param->values_count - 1)) {
                param->current_value_index++;
                if(param->change_callback) {
                    model->state = BtTestStateStopped;
                    model->message = BT_TEST_START_MESSAGE;
                    model->rssi = 0.0f;
                    model->packets_num_rx = 0;
                    model->packets_num_tx = 0;
                }
            }
        },
        true);
    if(param->change_callback) {
        param->change_callback(param);
    }
}

void bt_test_process_ok(BtTest* bt_test) {
    BtTestState state;
    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            if(model->state == BtTestStateStarted) {
                model->state = BtTestStateStopped;
                model->message = BT_TEST_START_MESSAGE;
                model->rssi = 0.0f;
                model->packets_num_rx = 0;
                model->packets_num_tx = 0;
            } else if(model->state == BtTestStateStopped) {
                model->state = BtTestStateStarted;
                model->message = BT_TEST_STOP_MESSAGE;
            }
            state = model->state;
        },
        true);
    if(bt_test->change_state_callback) {
        bt_test->change_state_callback(state, bt_test->context);
    }
}

void bt_test_process_back(BtTest* bt_test) {
    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            model->state = BtTestStateStopped;
            model->rssi = 0.0f;
            model->packets_num_rx = 0;
            model->packets_num_tx = 0;
        },
        false);
    if(bt_test->back_callback) {
        bt_test->back_callback(bt_test->context);
    }
}

BtTest* bt_test_alloc(void) {
    BtTest* bt_test = malloc(sizeof(BtTest));
    bt_test->view = view_alloc();
    view_set_context(bt_test->view, bt_test);
    view_allocate_model(bt_test->view, ViewModelTypeLocking, sizeof(BtTestModel));
    view_set_draw_callback(bt_test->view, bt_test_draw_callback);
    view_set_input_callback(bt_test->view, bt_test_input_callback);

    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            model->state = BtTestStateStopped;
            model->message = "Ok - Start";
            BtTestParamArray_init(model->params);
            model->position = 0;
            model->window_position = 0;
            model->rssi = 0.0f;
            model->packets_num_tx = 0;
            model->packets_num_rx = 0;
        },
        true);

    return bt_test;
}

void bt_test_free(BtTest* bt_test) {
    furi_assert(bt_test);

    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            BtTestParamArray_it_t it;
            for(BtTestParamArray_it(it, model->params); !BtTestParamArray_end_p(it);
                BtTestParamArray_next(it)) {
                furi_string_free(BtTestParamArray_ref(it)->current_value_text);
            }
            BtTestParamArray_clear(model->params);
        },
        false);
    view_free(bt_test->view);
    free(bt_test);
}

View* bt_test_get_view(BtTest* bt_test) {
    furi_assert(bt_test);
    return bt_test->view;
}

BtTestParam* bt_test_param_add(
    BtTest* bt_test,
    const char* label,
    uint8_t values_count,
    BtTestParamChangeCallback change_callback,
    void* context) {
    BtTestParam* param = NULL;
    furi_assert(label);
    furi_assert(bt_test);

    with_view_model(
        bt_test->view,
        BtTestModel * model,
        {
            param = BtTestParamArray_push_new(model->params);
            param->label = label;
            param->values_count = values_count;
            param->change_callback = change_callback;
            param->context = context;
            param->current_value_index = 0;
            param->current_value_text = furi_string_alloc();
        },
        true);

    return param;
}

void bt_test_set_rssi(BtTest* bt_test, float rssi) {
    furi_assert(bt_test);
    with_view_model(bt_test->view, BtTestModel * model, { model->rssi = rssi; }, true);
}

void bt_test_set_packets_tx(BtTest* bt_test, uint32_t packets_num) {
    furi_assert(bt_test);
    with_view_model(
        bt_test->view, BtTestModel * model, { model->packets_num_tx = packets_num; }, true);
}

void bt_test_set_packets_rx(BtTest* bt_test, uint32_t packets_num) {
    furi_assert(bt_test);
    with_view_model(
        bt_test->view, BtTestModel * model, { model->packets_num_rx = packets_num; }, true);
}

void bt_test_set_change_state_callback(BtTest* bt_test, BtTestChangeStateCallback callback) {
    furi_assert(bt_test);
    furi_assert(callback);
    bt_test->change_state_callback = callback;
}

void bt_test_set_back_callback(BtTest* bt_test, BtTestBackCallback callback) {
    furi_assert(bt_test);
    furi_assert(callback);
    bt_test->back_callback = callback;
}

void bt_test_set_context(BtTest* bt_test, void* context) {
    furi_assert(bt_test);
    bt_test->context = context;
}

void bt_test_set_current_value_index(BtTestParam* param, uint8_t current_value_index) {
    param->current_value_index = current_value_index;
}

void bt_test_set_current_value_text(BtTestParam* param, const char* current_value_text) {
    furi_string_set(param->current_value_text, current_value_text);
}

uint8_t bt_test_get_current_value_index(BtTestParam* param) {
    return param->current_value_index;
}

void* bt_test_get_context(BtTestParam* param) {
    return param->context;
}


================================================
FILE: applications/debug/bt_debug_app/views/bt_test.h
================================================
#pragma once
#include <gui/view.h>

typedef enum {
    BtTestStateStarted,
    BtTestStateStopped,
} BtTestState;

typedef struct BtTest BtTest;
typedef void (*BtTestChangeStateCallback)(BtTestState state, void* context);
typedef void (*BtTestBackCallback)(void* context);
typedef struct BtTestParam BtTestParam;
typedef void (*BtTestParamChangeCallback)(BtTestParam* param);

BtTest* bt_test_alloc(void);

void bt_test_free(BtTest* bt_test);

View* bt_test_get_view(BtTest* bt_test);

BtTestParam* bt_test_param_add(
    BtTest* bt_test,
    const char* label,
    uint8_t values_count,
    BtTestParamChangeCallback change_callback,
    void* context);

void bt_test_set_change_state_callback(BtTest* bt_test, BtTestChangeStateCallback callback);

void bt_test_set_back_callback(BtTest* bt_test, BtTestBackCallback callback);

void bt_test_set_context(BtTest* bt_test, void* context);

void bt_test_set_rssi(BtTest* bt_test, float rssi);

void bt_test_set_packets_tx(BtTest* bt_test, uint32_t packets_num);

void bt_test_set_packets_rx(BtTest* bt_test, uint32_t packets_num);

void bt_test_set_current_value_index(BtTestParam* param, uint8_t current_value_index);

void bt_test_set_current_value_text(BtTestParam* param, const char* current_value_text);

uint8_t bt_test_get_current_value_index(BtTestParam* param);

void* bt_test_get_context(BtTestParam* param);


================================================
FILE: applications/debug/bt_debug_app/views/bt_test_types.h
================================================
#pragma once

typedef enum {
    BtTestModeRx,
    BtTestModeTx,
    BtTestModeTxHopping,
} BtTestMode;

typedef enum {
    BtTestChannel2402 = 0,
    BtTestChannel2440 = 19,
    BtTestChannel2480 = 39,
} BtTestChannel;

typedef enum {
    BtPower0dB = 0x19,
    BtPower2dB = 0x1B,
    BtPower4dB = 0x1D,
    BtPower6dB = 0x1F,
} BtTestPower;

typedef enum {
    BtDataRate1M = 1,
    BtDataRate2M = 2,
} BtTestDataRate;

typedef struct {
    uint32_t value;
    const char* str;
} BtTestParamValue;


================================================
FILE: applications/debug/ccid_test/application.fam
================================================
App(
    appid="ccid_test",
    name="CCID Debug",
    apptype=FlipperAppType.DEBUG,
    entry_point="ccid_test_app",
    requires=[
        "gui",
    ],
    provides=[
        "ccid_test",
    ],
    stack_size=1 * 1024,
    fap_category="Debug",
)


================================================
FILE: applications/debug/ccid_test/ccid_test_app.c
================================================
#include <stdint.h>
#include <furi.h>
#include <furi_hal.h>

#include <gui/view.h>
#include <gui/view_dispatcher.h>
#include <gui/modules/submenu.h>
#include <gui/gui.h>

#include "iso7816/iso7816_handler.h"
#include "iso7816/iso7816_t0_apdu.h"
#include "iso7816/iso7816_atr.h"
#include "iso7816/iso7816_response.h"

#include "ccid_test_app_commands.h"

typedef enum {
    EventTypeInput,
} EventType;

typedef struct {
    Gui* gui;
    ViewPort* view_port;
    FuriMessageQueue* event_queue;
    FuriHalUsbCcidConfig ccid_cfg;
    Iso7816Handler* iso7816_handler;
} CcidTestApp;

typedef struct {
    union {
        InputEvent input;
    };
    EventType type;
} CcidTestAppEvent;

typedef enum {
    CcidTestSubmenuIndexInsertSmartcard,
    CcidTestSubmenuIndexRemoveSmartcard,
    CcidTestSubmenuIndexInsertSmartcardReader
} SubmenuIndex;

static void ccid_test_app_render_callback(Canvas* canvas, void* ctx) {
    UNUSED(ctx);
    canvas_clear(canvas);

    canvas_set_font(canvas, FontPrimary);
    canvas_draw_str(canvas, 0, 10, "CCID Test App");

    canvas_set_font(canvas, FontSecondary);
    canvas_draw_str(canvas, 0, 63, "Hold [back] to exit");
}

static void ccid_test_app_input_callback(InputEvent* input_event, void* ctx) {
    FuriMessageQueue* event_queue = ctx;

    CcidTestAppEvent event;
    event.type = EventTypeInput;
    event.input = *input_event;
    furi_message_queue_put(event_queue, &event, FuriWaitForever);
}

uint32_t ccid_test_exit(void* context) {
    UNUSED(context);
    return VIEW_NONE;
}

CcidTestApp* ccid_test_app_alloc(void) {
    CcidTestApp* app = malloc(sizeof(CcidTestApp));

    //setup CCID USB
    // On linux: set VID PID using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
    app->ccid_cfg.vid = 0x076B;
    app->ccid_cfg.pid = 0x3A21;

    app->iso7816_handler = iso7816_handler_alloc();
    app->iso7816_handler->iso7816_answer_to_reset = iso7816_answer_to_reset;
    app->iso7816_handler->iso7816_process_command = iso7816_process_command;

    // Gui
    app->gui = furi_record_open(RECORD_GUI);

    //viewport
    app->view_port = view_port_alloc();
    gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen);
    view_port_draw_callback_set(app->view_port, ccid_test_app_render_callback, NULL);

    //message queue
    app->event_queue = furi_message_queue_alloc(8, sizeof(CcidTestAppEvent));
    view_port_input_callback_set(app->view_port, ccid_test_app_input_callback, app->event_queue);

    return app;
}

void ccid_test_app_free(CcidTestApp* app) {
    furi_assert(app);

    //message queue
    furi_message_queue_free(app->event_queue);

    //view port
    gui_remove_view_port(app->gui, app->view_port);
    view_port_free(app->view_port);

    // Close gui record
    furi_record_close(RECORD_GUI);
    app->gui = NULL;

    iso7816_handler_free(app->iso7816_handler);

    // Free rest
    free(app);
}
Download .txt
gitextract_izuyb6zx/

├── .clang-format
├── .clangd
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01_bug_report.yml
│   │   ├── 02_enhancements.yml
│   │   ├── 03_feature_request.yml
│   │   └── config.yml
│   ├── actions/
│   │   └── submit_sdk/
│   │       └── action.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── build.yml
│       ├── build_compact.yml
│       ├── docs.yml
│       ├── lint_and_submodule_check.yml
│       ├── merge_report.yml
│       ├── pvs_studio.yml
│       ├── reindex.yml
│       ├── unit_tests.yml
│       └── updater_test.yml
├── .gitignore
├── .gitmodules
├── .pvsconfig
├── .pvsoptions
├── .sublime-project
├── .vscode/
│   └── ReadMe.md
├── CODE_OF_CONDUCT.md
├── CODING_STYLE.md
├── CONTRIBUTING.md
├── LICENSE
├── ReadMe.md
├── SConstruct
├── applications/
│   ├── ReadMe.md
│   ├── debug/
│   │   ├── accessor/
│   │   │   ├── accessor.cpp
│   │   │   ├── accessor_app.cpp
│   │   │   ├── accessor_app.h
│   │   │   ├── accessor_event.h
│   │   │   ├── accessor_view_manager.cpp
│   │   │   ├── accessor_view_manager.h
│   │   │   ├── application.fam
│   │   │   ├── callback_connector.h
│   │   │   ├── helpers/
│   │   │   │   ├── wiegand.cpp
│   │   │   │   └── wiegand.h
│   │   │   └── scene/
│   │   │       ├── accessor_scene_generic.h
│   │   │       ├── accessor_scene_start.cpp
│   │   │       └── accessor_scene_start.h
│   │   ├── application.fam
│   │   ├── battery_test_app/
│   │   │   ├── application.fam
│   │   │   ├── battery_test_app.c
│   │   │   ├── battery_test_app.h
│   │   │   └── views/
│   │   │       ├── battery_info.c
│   │   │       └── battery_info.h
│   │   ├── blink_test/
│   │   │   ├── application.fam
│   │   │   └── blink_test.c
│   │   ├── bt_debug_app/
│   │   │   ├── application.fam
│   │   │   ├── bt_debug_app.c
│   │   │   ├── bt_debug_app.h
│   │   │   └── views/
│   │   │       ├── bt_carrier_test.c
│   │   │       ├── bt_carrier_test.h
│   │   │       ├── bt_packet_test.c
│   │   │       ├── bt_packet_test.h
│   │   │       ├── bt_test.c
│   │   │       ├── bt_test.h
│   │   │       └── bt_test_types.h
│   │   ├── ccid_test/
│   │   │   ├── application.fam
│   │   │   ├── ccid_test_app.c
│   │   │   ├── ccid_test_app_commands.c
│   │   │   ├── ccid_test_app_commands.h
│   │   │   ├── client/
│   │   │   │   ├── ccid_client.py
│   │   │   │   └── requirements.txt
│   │   │   └── iso7816/
│   │   │       ├── iso7816_atr.h
│   │   │       ├── iso7816_handler.c
│   │   │       ├── iso7816_handler.h
│   │   │       ├── iso7816_response.c
│   │   │       ├── iso7816_response.h
│   │   │       ├── iso7816_t0_apdu.c
│   │   │       └── iso7816_t0_apdu.h
│   │   ├── crash_test/
│   │   │   ├── application.fam
│   │   │   └── crash_test.c
│   │   ├── direct_draw/
│   │   │   ├── application.fam
│   │   │   └── direct_draw.c
│   │   ├── display_test/
│   │   │   ├── application.fam
│   │   │   ├── display_test.c
│   │   │   ├── view_display_test.c
│   │   │   └── view_display_test.h
│   │   ├── event_loop_blink_test/
│   │   │   ├── application.fam
│   │   │   └── event_loop_blink_test.c
│   │   ├── expansion_test/
│   │   │   ├── application.fam
│   │   │   ├── assets/
│   │   │   │   └── test.txt
│   │   │   └── expansion_test.c
│   │   ├── file_browser_test/
│   │   │   ├── application.fam
│   │   │   ├── file_browser_app.c
│   │   │   ├── file_browser_app_i.h
│   │   │   └── scenes/
│   │   │       ├── file_browser_scene.c
│   │   │       ├── file_browser_scene.h
│   │   │       ├── file_browser_scene_browser.c
│   │   │       ├── file_browser_scene_config.h
│   │   │       ├── file_browser_scene_result.c
│   │   │       └── file_browser_scene_start.c
│   │   ├── infrared_test/
│   │   │   ├── application.fam
│   │   │   └── infrared_test.c
│   │   ├── keypad_test/
│   │   │   ├── application.fam
│   │   │   └── keypad_test.c
│   │   ├── lfrfid_debug/
│   │   │   ├── application.fam
│   │   │   ├── lfrfid_debug.c
│   │   │   ├── lfrfid_debug_i.h
│   │   │   ├── scenes/
│   │   │   │   ├── lfrfid_debug_app_scene_start.c
│   │   │   │   ├── lfrfid_debug_app_scene_tune.c
│   │   │   │   ├── lfrfid_debug_scene.c
│   │   │   │   ├── lfrfid_debug_scene.h
│   │   │   │   └── lfrfid_debug_scene_config.h
│   │   │   └── views/
│   │   │       ├── lfrfid_debug_view_tune.c
│   │   │       └── lfrfid_debug_view_tune.h
│   │   ├── loader_chaining_a/
│   │   │   ├── application.fam
│   │   │   └── loader_chaining_a.c
│   │   ├── loader_chaining_b/
│   │   │   ├── application.fam
│   │   │   └── loader_chaining_b.c
│   │   ├── locale_test/
│   │   │   ├── application.fam
│   │   │   └── locale_test.c
│   │   ├── rpc_debug_app/
│   │   │   ├── application.fam
│   │   │   ├── rpc_debug_app.c
│   │   │   ├── rpc_debug_app.h
│   │   │   └── scenes/
│   │   │       ├── rpc_debug_app_scene.c
│   │   │       ├── rpc_debug_app_scene.h
│   │   │       ├── rpc_debug_app_scene_config.h
│   │   │       ├── rpc_debug_app_scene_input_data_exchange.c
│   │   │       ├── rpc_debug_app_scene_input_error_code.c
│   │   │       ├── rpc_debug_app_scene_input_error_text.c
│   │   │       ├── rpc_debug_app_scene_receive_data_exchange.c
│   │   │       ├── rpc_debug_app_scene_start.c
│   │   │       ├── rpc_debug_app_scene_start_dummy.c
│   │   │       ├── rpc_debug_app_scene_test_app_error.c
│   │   │       └── rpc_debug_app_scene_test_data_exchange.c
│   │   ├── speaker_debug/
│   │   │   ├── application.fam
│   │   │   └── speaker_debug.c
│   │   ├── subghz_test/
│   │   │   ├── application.fam
│   │   │   ├── helpers/
│   │   │   │   ├── subghz_test_event.h
│   │   │   │   ├── subghz_test_frequency.c
│   │   │   │   ├── subghz_test_frequency.h
│   │   │   │   └── subghz_test_types.h
│   │   │   ├── protocol/
│   │   │   │   ├── math.c
│   │   │   │   ├── math.h
│   │   │   │   ├── princeton_for_testing.c
│   │   │   │   └── princeton_for_testing.h
│   │   │   ├── scenes/
│   │   │   │   ├── subghz_test_scene.c
│   │   │   │   ├── subghz_test_scene.h
│   │   │   │   ├── subghz_test_scene_about.c
│   │   │   │   ├── subghz_test_scene_carrier.c
│   │   │   │   ├── subghz_test_scene_config.h
│   │   │   │   ├── subghz_test_scene_packet.c
│   │   │   │   ├── subghz_test_scene_show_only_rx.c
│   │   │   │   ├── subghz_test_scene_start.c
│   │   │   │   └── subghz_test_scene_static.c
│   │   │   ├── subghz_test_app.c
│   │   │   ├── subghz_test_app_i.c
│   │   │   ├── subghz_test_app_i.h
│   │   │   └── views/
│   │   │       ├── subghz_test_carrier.c
│   │   │       ├── subghz_test_carrier.h
│   │   │       ├── subghz_test_packet.c
│   │   │       ├── subghz_test_packet.h
│   │   │       ├── subghz_test_static.c
│   │   │       └── subghz_test_static.h
│   │   ├── text_box_element_test/
│   │   │   ├── application.fam
│   │   │   └── text_box_element_test.c
│   │   ├── text_box_view_test/
│   │   │   ├── application.fam
│   │   │   └── text_box_view_test.c
│   │   ├── uart_echo/
│   │   │   ├── application.fam
│   │   │   └── uart_echo.c
│   │   ├── unit_tests/
│   │   │   ├── application.fam
│   │   │   ├── resources/
│   │   │   │   └── unit_tests/
│   │   │   │       ├── Manifest_test
│   │   │   │       ├── compress/
│   │   │   │       │   └── test.ths
│   │   │   │       ├── infrared/
│   │   │   │       │   ├── test_kaseikyo.irtest
│   │   │   │       │   ├── test_nec.irtest
│   │   │   │       │   ├── test_nec42.irtest
│   │   │   │       │   ├── test_nec42ext.irtest
│   │   │   │       │   ├── test_necext.irtest
│   │   │   │       │   ├── test_pioneer.irtest
│   │   │   │       │   ├── test_rc5.irtest
│   │   │   │       │   ├── test_rc5x.irtest
│   │   │   │       │   ├── test_rc6.irtest
│   │   │   │       │   ├── test_rca.irtest
│   │   │   │       │   ├── test_samsung32.irtest
│   │   │   │       │   └── test_sirc.irtest
│   │   │   │       ├── js/
│   │   │   │       │   ├── basic.js
│   │   │   │       │   ├── event_loop.js
│   │   │   │       │   ├── math.js
│   │   │   │       │   └── storage.js
│   │   │   │       ├── nfc/
│   │   │   │       │   ├── Felica.nfc
│   │   │   │       │   ├── Ntag213_locked.nfc
│   │   │   │       │   ├── Ntag215.nfc
│   │   │   │       │   ├── Ntag216.nfc
│   │   │   │       │   ├── Slix_cap_accept_all_pass.nfc
│   │   │   │       │   ├── Slix_cap_default.nfc
│   │   │   │       │   ├── Slix_cap_missed.nfc
│   │   │   │       │   ├── Ultralight_11.nfc
│   │   │   │       │   ├── Ultralight_21.nfc
│   │   │   │       │   ├── Ultralight_C.nfc
│   │   │   │       │   ├── nfc_nfca_signal_long.nfc
│   │   │   │       │   └── nfc_nfca_signal_short.nfc
│   │   │   │       ├── storage/
│   │   │   │       │   └── md5.txt
│   │   │   │       └── subghz/
│   │   │   │           ├── alutech_at_4n_raw.sub
│   │   │   │           ├── ansonic.sub
│   │   │   │           ├── ansonic_raw.sub
│   │   │   │           ├── bett.sub
│   │   │   │           ├── bett_raw.sub
│   │   │   │           ├── came.sub
│   │   │   │           ├── came_atomo_raw.sub
│   │   │   │           ├── came_raw.sub
│   │   │   │           ├── came_twee.sub
│   │   │   │           ├── came_twee_raw.sub
│   │   │   │           ├── cenmax_raw.sub
│   │   │   │           ├── clemsa.sub
│   │   │   │           ├── clemsa_raw.sub
│   │   │   │           ├── dickert_mahs.sub
│   │   │   │           ├── dickert_raw.sub
│   │   │   │           ├── doitrand.sub
│   │   │   │           ├── doitrand_raw.sub
│   │   │   │           ├── doorhan.sub
│   │   │   │           ├── doorhan_raw.sub
│   │   │   │           ├── dooya.sub
│   │   │   │           ├── dooya_raw.sub
│   │   │   │           ├── faac_slh_raw.sub
│   │   │   │           ├── feron.sub
│   │   │   │           ├── feron_raw.sub
│   │   │   │           ├── gangqi.sub
│   │   │   │           ├── gangqi_raw.sub
│   │   │   │           ├── gate_tx.sub
│   │   │   │           ├── gate_tx_raw.sub
│   │   │   │           ├── hay21_raw.sub
│   │   │   │           ├── hollarm.sub
│   │   │   │           ├── hollarm_raw.sub
│   │   │   │           ├── holtek.sub
│   │   │   │           ├── holtek_ht12x.sub
│   │   │   │           ├── holtek_ht12x_raw.sub
│   │   │   │           ├── holtek_raw.sub
│   │   │   │           ├── honeywell_wdb.sub
│   │   │   │           ├── honeywell_wdb_raw.sub
│   │   │   │           ├── hormann_hsm_raw.sub
│   │   │   │           ├── ido_117_111_raw.sub
│   │   │   │           ├── intertechno_v3.sub
│   │   │   │           ├── intertechno_v3_raw.sub
│   │   │   │           ├── kia_seed_raw.sub
│   │   │   │           ├── kinggates_stylo4k_raw.sub
│   │   │   │           ├── legrand.sub
│   │   │   │           ├── legrand_raw.sub
│   │   │   │           ├── linear.sub
│   │   │   │           ├── linear_delta3.sub
│   │   │   │           ├── linear_delta3_raw.sub
│   │   │   │           ├── linear_raw.sub
│   │   │   │           ├── magellan.sub
│   │   │   │           ├── magellan_raw.sub
│   │   │   │           ├── marantec.sub
│   │   │   │           ├── marantec24.sub
│   │   │   │           ├── marantec24_raw.sub
│   │   │   │           ├── marantec_raw.sub
│   │   │   │           ├── mastercode.sub
│   │   │   │           ├── mastercode_raw.sub
│   │   │   │           ├── megacode.sub
│   │   │   │           ├── megacode_raw.sub
│   │   │   │           ├── nero_radio_raw.sub
│   │   │   │           ├── nero_sketch_raw.sub
│   │   │   │           ├── nice_flo.sub
│   │   │   │           ├── nice_flo_raw.sub
│   │   │   │           ├── nice_flor_s_raw.sub
│   │   │   │           ├── nice_one_raw.sub
│   │   │   │           ├── phoenix_v2.sub
│   │   │   │           ├── phoenix_v2_raw.sub
│   │   │   │           ├── power_smart.sub
│   │   │   │           ├── power_smart_raw.sub
│   │   │   │           ├── princeton.sub
│   │   │   │           ├── princeton_raw.sub
│   │   │   │           ├── revers_rb2.sub
│   │   │   │           ├── revers_rb2_raw.sub
│   │   │   │           ├── roger.sub
│   │   │   │           ├── roger_raw.sub
│   │   │   │           ├── scher_khan_magic_code.sub
│   │   │   │           ├── security_pls_1_0.sub
│   │   │   │           ├── security_pls_1_0_raw.sub
│   │   │   │           ├── security_pls_2_0.sub
│   │   │   │           ├── security_pls_2_0_raw.sub
│   │   │   │           ├── smc5326.sub
│   │   │   │           ├── smc5326_raw.sub
│   │   │   │           ├── somfy_keytis_raw.sub
│   │   │   │           ├── somfy_telis_raw.sub
│   │   │   │           └── test_random_raw.sub
│   │   │   ├── test_runner.c
│   │   │   ├── test_runner.h
│   │   │   ├── tests/
│   │   │   │   ├── args/
│   │   │   │   │   └── args_test.c
│   │   │   │   ├── bit_lib/
│   │   │   │   │   └── bit_lib_test.c
│   │   │   │   ├── bt/
│   │   │   │   │   └── bt_test.c
│   │   │   │   ├── common/
│   │   │   │   │   └── common.c
│   │   │   │   ├── compress/
│   │   │   │   │   └── compress_test.c
│   │   │   │   ├── datetime/
│   │   │   │   │   └── datetimelib_test.c
│   │   │   │   ├── dialogs_file_browser_options/
│   │   │   │   │   └── dialogs_file_browser_options.c
│   │   │   │   ├── dirwalk/
│   │   │   │   │   └── dirwalk_test.c
│   │   │   │   ├── expansion/
│   │   │   │   │   └── expansion_test.c
│   │   │   │   ├── flipper_format/
│   │   │   │   │   └── flipper_format_test.c
│   │   │   │   ├── flipper_format_string/
│   │   │   │   │   └── flipper_format_string_test.c
│   │   │   │   ├── float_tools/
│   │   │   │   │   └── float_tools_test.c
│   │   │   │   ├── furi/
│   │   │   │   │   ├── furi_errno_test.c
│   │   │   │   │   ├── furi_event_loop_test.c
│   │   │   │   │   ├── furi_memmgr_test.c
│   │   │   │   │   ├── furi_primitives_test.c
│   │   │   │   │   ├── furi_pubsub_test.c
│   │   │   │   │   ├── furi_record_test.c
│   │   │   │   │   ├── furi_stdio_test.c
│   │   │   │   │   └── furi_test.c
│   │   │   │   ├── furi_hal/
│   │   │   │   │   └── furi_hal_tests.c
│   │   │   │   ├── furi_hal_crypto/
│   │   │   │   │   └── furi_hal_crypto_tests.c
│   │   │   │   ├── furi_string/
│   │   │   │   │   └── furi_string_test.c
│   │   │   │   ├── infrared/
│   │   │   │   │   └── infrared_test.c
│   │   │   │   ├── js/
│   │   │   │   │   └── js_test.c
│   │   │   │   ├── lfrfid/
│   │   │   │   │   └── lfrfid_protocols.c
│   │   │   │   ├── manifest/
│   │   │   │   │   └── manifest.c
│   │   │   │   ├── minunit.h
│   │   │   │   ├── minunit_vars.h
│   │   │   │   ├── minunit_vars_ex.h
│   │   │   │   ├── nfc/
│   │   │   │   │   └── nfc_test.c
│   │   │   │   ├── notification/
│   │   │   │   │   └── notes_test.c
│   │   │   │   ├── pipe/
│   │   │   │   │   └── pipe_test.c
│   │   │   │   ├── power/
│   │   │   │   │   └── power_test.c
│   │   │   │   ├── protocol_dict/
│   │   │   │   │   └── protocol_dict_test.c
│   │   │   │   ├── rpc/
│   │   │   │   │   └── rpc_test.c
│   │   │   │   ├── storage/
│   │   │   │   │   └── storage_test.c
│   │   │   │   ├── stream/
│   │   │   │   │   └── stream_test.c
│   │   │   │   ├── strint/
│   │   │   │   │   └── strint_test.c
│   │   │   │   ├── subghz/
│   │   │   │   │   └── subghz_test.c
│   │   │   │   ├── test.h
│   │   │   │   ├── test_api.h
│   │   │   │   └── varint/
│   │   │   │       └── varint_test.c
│   │   │   ├── unit_test_api_table.cpp
│   │   │   ├── unit_test_api_table_i.h
│   │   │   └── unit_tests.c
│   │   ├── usb_mouse/
│   │   │   ├── application.fam
│   │   │   └── usb_mouse.c
│   │   ├── usb_test/
│   │   │   ├── application.fam
│   │   │   └── usb_test.c
│   │   └── vibro_test/
│   │       ├── application.fam
│   │       └── vibro_test.c
│   ├── drivers/
│   │   ├── application.fam
│   │   └── subghz/
│   │       ├── application.fam
│   │       └── cc1101_ext/
│   │           ├── cc1101_ext.c
│   │           ├── cc1101_ext.h
│   │           ├── cc1101_ext_interconnect.c
│   │           └── cc1101_ext_interconnect.h
│   ├── examples/
│   │   ├── application.fam
│   │   ├── example_adc/
│   │   │   ├── application.fam
│   │   │   └── example_adc.c
│   │   ├── example_apps_assets/
│   │   │   ├── README.md
│   │   │   ├── application.fam
│   │   │   ├── example_apps_assets.c
│   │   │   └── files/
│   │   │       ├── poems/
│   │   │       │   ├── a jelly-fish.txt
│   │   │       │   ├── my shadow.txt
│   │   │       │   └── theme in yellow.txt
│   │   │       └── test_asset.txt
│   │   ├── example_apps_data/
│   │   │   ├── README.md
│   │   │   ├── application.fam
│   │   │   └── example_apps_data.c
│   │   ├── example_ble_beacon/
│   │   │   ├── application.fam
│   │   │   ├── ble_beacon_app.c
│   │   │   ├── ble_beacon_app.h
│   │   │   └── scenes/
│   │   │       ├── scene_config.h
│   │   │       ├── scene_input_beacon_data.c
│   │   │       ├── scene_input_mac_addr.c
│   │   │       ├── scene_menu.c
│   │   │       ├── scene_run_beacon.c
│   │   │       ├── scenes.c
│   │   │       └── scenes.h
│   │   ├── example_custom_font/
│   │   │   ├── application.fam
│   │   │   └── example_custom_font.c
│   │   ├── example_event_loop/
│   │   │   ├── application.fam
│   │   │   ├── example_event_loop_event_flags.c
│   │   │   ├── example_event_loop_multi.c
│   │   │   ├── example_event_loop_mutex.c
│   │   │   ├── example_event_loop_stream_buffer.c
│   │   │   └── example_event_loop_timer.c
│   │   ├── example_images/
│   │   │   ├── ReadMe.md
│   │   │   ├── application.fam
│   │   │   └── example_images.c
│   │   ├── example_number_input/
│   │   │   ├── ReadMe.md
│   │   │   ├── application.fam
│   │   │   ├── example_number_input.c
│   │   │   ├── example_number_input.h
│   │   │   └── scenes/
│   │   │       ├── example_number_input_scene.c
│   │   │       ├── example_number_input_scene.h
│   │   │       ├── example_number_input_scene_config.h
│   │   │       ├── example_number_input_scene_input_max.c
│   │   │       ├── example_number_input_scene_input_min.c
│   │   │       ├── example_number_input_scene_input_number.c
│   │   │       └── example_number_input_scene_show_number.c
│   │   ├── example_plugins/
│   │   │   ├── application.fam
│   │   │   ├── example_plugins.c
│   │   │   ├── example_plugins_multi.c
│   │   │   ├── plugin1.c
│   │   │   ├── plugin2.c
│   │   │   └── plugin_interface.h
│   │   ├── example_plugins_advanced/
│   │   │   ├── app_api.c
│   │   │   ├── app_api.h
│   │   │   ├── app_api_interface.h
│   │   │   ├── app_api_table.cpp
│   │   │   ├── app_api_table_i.h
│   │   │   ├── application.fam
│   │   │   ├── example_advanced_plugins.c
│   │   │   ├── plugin1.c
│   │   │   ├── plugin2.c
│   │   │   └── plugin_interface.h
│   │   ├── example_thermo/
│   │   │   ├── README.md
│   │   │   ├── application.fam
│   │   │   └── example_thermo.c
│   │   ├── example_view_dispatcher/
│   │   │   ├── application.fam
│   │   │   └── example_view_dispatcher.c
│   │   └── example_view_holder/
│   │       ├── application.fam
│   │       └── example_view_holder.c
│   ├── main/
│   │   ├── application.fam
│   │   ├── archive/
│   │   │   ├── application.fam
│   │   │   ├── archive.c
│   │   │   ├── archive.h
│   │   │   ├── archive_i.h
│   │   │   ├── helpers/
│   │   │   │   ├── archive_apps.c
│   │   │   │   ├── archive_apps.h
│   │   │   │   ├── archive_browser.c
│   │   │   │   ├── archive_browser.h
│   │   │   │   ├── archive_favorites.c
│   │   │   │   ├── archive_favorites.h
│   │   │   │   ├── archive_files.c
│   │   │   │   └── archive_files.h
│   │   │   ├── scenes/
│   │   │   │   ├── archive_scene.c
│   │   │   │   ├── archive_scene.h
│   │   │   │   ├── archive_scene_browser.c
│   │   │   │   ├── archive_scene_config.h
│   │   │   │   ├── archive_scene_delete.c
│   │   │   │   └── archive_scene_rename.c
│   │   │   └── views/
│   │   │       ├── archive_browser_view.c
│   │   │       └── archive_browser_view.h
│   │   ├── bad_usb/
│   │   │   ├── application.fam
│   │   │   ├── bad_usb_app.c
│   │   │   ├── bad_usb_app.h
│   │   │   ├── bad_usb_app_i.h
│   │   │   ├── helpers/
│   │   │   │   ├── bad_usb_hid.c
│   │   │   │   ├── bad_usb_hid.h
│   │   │   │   ├── ducky_script.c
│   │   │   │   ├── ducky_script.h
│   │   │   │   ├── ducky_script_commands.c
│   │   │   │   ├── ducky_script_i.h
│   │   │   │   └── ducky_script_keycodes.c
│   │   │   ├── resources/
│   │   │   │   └── badusb/
│   │   │   │       ├── Install_qFlipper_gnome.txt
│   │   │   │       ├── Install_qFlipper_macOS.txt
│   │   │   │       ├── Install_qFlipper_windows.txt
│   │   │   │       ├── assets/
│   │   │   │       │   └── layouts/
│   │   │   │       │       ├── ba-BA.kl
│   │   │   │       │       ├── cz_CS.kl
│   │   │   │       │       ├── da-DA.kl
│   │   │   │       │       ├── de-CH.kl
│   │   │   │       │       ├── de-DE.kl
│   │   │   │       │       ├── dvorak.kl
│   │   │   │       │       ├── en-UK.kl
│   │   │   │       │       ├── en-US.kl
│   │   │   │       │       ├── es-ES.kl
│   │   │   │       │       ├── es-LA.kl
│   │   │   │       │       ├── fr-BE.kl
│   │   │   │       │       ├── fr-CA.kl
│   │   │   │       │       ├── fr-CH.kl
│   │   │   │       │       ├── fr-FR-mac.kl
│   │   │   │       │       ├── fr-FR.kl
│   │   │   │       │       ├── hr-HR.kl
│   │   │   │       │       ├── hu-HU.kl
│   │   │   │       │       ├── it-IT-mac.kl
│   │   │   │       │       ├── it-IT.kl
│   │   │   │       │       ├── nb-NO.kl
│   │   │   │       │       ├── nl-NL.kl
│   │   │   │       │       ├── pt-BR.kl
│   │   │   │       │       ├── pt-PT.kl
│   │   │   │       │       ├── si-SI.kl
│   │   │   │       │       ├── sk-SK.kl
│   │   │   │       │       ├── sv-SE.kl
│   │   │   │       │       └── tr-TR.kl
│   │   │   │       ├── demo_chromeos.txt
│   │   │   │       ├── demo_gnome.txt
│   │   │   │       ├── demo_macos.txt
│   │   │   │       ├── demo_windows.txt
│   │   │   │       └── test_mouse.txt
│   │   │   ├── scenes/
│   │   │   │   ├── bad_usb_scene.c
│   │   │   │   ├── bad_usb_scene.h
│   │   │   │   ├── bad_usb_scene_config.c
│   │   │   │   ├── bad_usb_scene_config.h
│   │   │   │   ├── bad_usb_scene_config_layout.c
│   │   │   │   ├── bad_usb_scene_confirm_unpair.c
│   │   │   │   ├── bad_usb_scene_error.c
│   │   │   │   ├── bad_usb_scene_file_select.c
│   │   │   │   ├── bad_usb_scene_unpair_done.c
│   │   │   │   └── bad_usb_scene_work.c
│   │   │   └── views/
│   │   │       ├── bad_usb_view.c
│   │   │       └── bad_usb_view.h
│   │   ├── gpio/
│   │   │   ├── application.fam
│   │   │   ├── gpio_app.c
│   │   │   ├── gpio_app.h
│   │   │   ├── gpio_app_i.h
│   │   │   ├── gpio_custom_event.h
│   │   │   ├── gpio_items.c
│   │   │   ├── gpio_items.h
│   │   │   ├── scenes/
│   │   │   │   ├── gpio_scene.c
│   │   │   │   ├── gpio_scene.h
│   │   │   │   ├── gpio_scene_config.h
│   │   │   │   ├── gpio_scene_start.c
│   │   │   │   ├── gpio_scene_test.c
│   │   │   │   ├── gpio_scene_usb_uart.c
│   │   │   │   ├── gpio_scene_usb_uart_close_rpc.c
│   │   │   │   └── gpio_scene_usb_uart_config.c
│   │   │   ├── usb_uart_bridge.c
│   │   │   ├── usb_uart_bridge.h
│   │   │   └── views/
│   │   │       ├── gpio_test.c
│   │   │       ├── gpio_test.h
│   │   │       ├── gpio_usb_uart.c
│   │   │       └── gpio_usb_uart.h
│   │   ├── ibutton/
│   │   │   ├── application.fam
│   │   │   ├── ibutton.c
│   │   │   ├── ibutton.h
│   │   │   ├── ibutton_cli.c
│   │   │   ├── ibutton_custom_event.h
│   │   │   ├── ibutton_i.h
│   │   │   └── scenes/
│   │   │       ├── ibutton_scene.c
│   │   │       ├── ibutton_scene.h
│   │   │       ├── ibutton_scene_add_type.c
│   │   │       ├── ibutton_scene_add_value.c
│   │   │       ├── ibutton_scene_config.h
│   │   │       ├── ibutton_scene_delete_confirm.c
│   │   │       ├── ibutton_scene_delete_success.c
│   │   │       ├── ibutton_scene_emulate.c
│   │   │       ├── ibutton_scene_exit_confirm.c
│   │   │       ├── ibutton_scene_info.c
│   │   │       ├── ibutton_scene_read.c
│   │   │       ├── ibutton_scene_read_error.c
│   │   │       ├── ibutton_scene_read_key_menu.c
│   │   │       ├── ibutton_scene_read_success.c
│   │   │       ├── ibutton_scene_retry_confirm.c
│   │   │       ├── ibutton_scene_rpc.c
│   │   │       ├── ibutton_scene_save_name.c
│   │   │       ├── ibutton_scene_save_success.c
│   │   │       ├── ibutton_scene_saved_key_menu.c
│   │   │       ├── ibutton_scene_select_key.c
│   │   │       ├── ibutton_scene_start.c
│   │   │       ├── ibutton_scene_view_data.c
│   │   │       ├── ibutton_scene_write.c
│   │   │       └── ibutton_scene_write_success.c
│   │   ├── infrared/
│   │   │   ├── application.fam
│   │   │   ├── infrared_app.c
│   │   │   ├── infrared_app.h
│   │   │   ├── infrared_app_i.h
│   │   │   ├── infrared_cli.c
│   │   │   ├── infrared_custom_event.h
│   │   │   ├── infrared_remote.c
│   │   │   ├── infrared_remote.h
│   │   │   ├── resources/
│   │   │   │   └── infrared/
│   │   │   │       └── assets/
│   │   │   │           ├── ac.ir
│   │   │   │           ├── audio.ir
│   │   │   │           ├── projector.ir
│   │   │   │           └── tv.ir
│   │   │   ├── scenes/
│   │   │   │   ├── common/
│   │   │   │   │   ├── infrared_scene_universal_common.c
│   │   │   │   │   └── infrared_scene_universal_common.h
│   │   │   │   ├── infrared_scene.c
│   │   │   │   ├── infrared_scene.h
│   │   │   │   ├── infrared_scene_ask_back.c
│   │   │   │   ├── infrared_scene_ask_retry.c
│   │   │   │   ├── infrared_scene_config.h
│   │   │   │   ├── infrared_scene_debug.c
│   │   │   │   ├── infrared_scene_edit.c
│   │   │   │   ├── infrared_scene_edit_button_select.c
│   │   │   │   ├── infrared_scene_edit_delete.c
│   │   │   │   ├── infrared_scene_edit_delete_done.c
│   │   │   │   ├── infrared_scene_edit_move.c
│   │   │   │   ├── infrared_scene_edit_rename.c
│   │   │   │   ├── infrared_scene_edit_rename_done.c
│   │   │   │   ├── infrared_scene_error_databases.c
│   │   │   │   ├── infrared_scene_gpio_settings.c
│   │   │   │   ├── infrared_scene_learn.c
│   │   │   │   ├── infrared_scene_learn_done.c
│   │   │   │   ├── infrared_scene_learn_enter_name.c
│   │   │   │   ├── infrared_scene_learn_success.c
│   │   │   │   ├── infrared_scene_remote.c
│   │   │   │   ├── infrared_scene_remote_list.c
│   │   │   │   ├── infrared_scene_rpc.c
│   │   │   │   ├── infrared_scene_start.c
│   │   │   │   ├── infrared_scene_universal.c
│   │   │   │   ├── infrared_scene_universal_ac.c
│   │   │   │   ├── infrared_scene_universal_audio.c
│   │   │   │   ├── infrared_scene_universal_projector.c
│   │   │   │   └── infrared_scene_universal_tv.c
│   │   │   └── views/
│   │   │       ├── infrared_debug_view.c
│   │   │       ├── infrared_debug_view.h
│   │   │       ├── infrared_move_view.c
│   │   │       ├── infrared_move_view.h
│   │   │       ├── infrared_progress_view.c
│   │   │       └── infrared_progress_view.h
│   │   ├── lfrfid/
│   │   │   ├── application.fam
│   │   │   ├── lfrfid.c
│   │   │   ├── lfrfid_cli.c
│   │   │   ├── lfrfid_i.h
│   │   │   ├── resources/
│   │   │   │   └── lfrfid/
│   │   │   │       └── assets/
│   │   │   │           └── iso3166.lfrfid
│   │   │   ├── scenes/
│   │   │   │   ├── lfrfid_scene.c
│   │   │   │   ├── lfrfid_scene.h
│   │   │   │   ├── lfrfid_scene_config.h
│   │   │   │   ├── lfrfid_scene_delete_confirm.c
│   │   │   │   ├── lfrfid_scene_delete_success.c
│   │   │   │   ├── lfrfid_scene_emulate.c
│   │   │   │   ├── lfrfid_scene_exit_confirm.c
│   │   │   │   ├── lfrfid_scene_extra_actions.c
│   │   │   │   ├── lfrfid_scene_raw_info.c
│   │   │   │   ├── lfrfid_scene_raw_name.c
│   │   │   │   ├── lfrfid_scene_raw_read.c
│   │   │   │   ├── lfrfid_scene_raw_success.c
│   │   │   │   ├── lfrfid_scene_read.c
│   │   │   │   ├── lfrfid_scene_read_key_menu.c
│   │   │   │   ├── lfrfid_scene_read_success.c
│   │   │   │   ├── lfrfid_scene_retry_confirm.c
│   │   │   │   ├── lfrfid_scene_rpc.c
│   │   │   │   ├── lfrfid_scene_save_data.c
│   │   │   │   ├── lfrfid_scene_save_name.c
│   │   │   │   ├── lfrfid_scene_save_success.c
│   │   │   │   ├── lfrfid_scene_save_type.c
│   │   │   │   ├── lfrfid_scene_saved_info.c
│   │   │   │   ├── lfrfid_scene_saved_key_menu.c
│   │   │   │   ├── lfrfid_scene_select_key.c
│   │   │   │   ├── lfrfid_scene_start.c
│   │   │   │   ├── lfrfid_scene_write.c
│   │   │   │   └── lfrfid_scene_write_success.c
│   │   │   └── views/
│   │   │       ├── lfrfid_view_read.c
│   │   │       └── lfrfid_view_read.h
│   │   ├── nfc/
│   │   │   ├── api/
│   │   │   │   ├── gallagher/
│   │   │   │   │   ├── gallagher_util.c
│   │   │   │   │   └── gallagher_util.h
│   │   │   │   ├── mosgortrans/
│   │   │   │   │   ├── mosgortrans_util.c
│   │   │   │   │   └── mosgortrans_util.h
│   │   │   │   ├── nfc_app_api_interface.h
│   │   │   │   ├── nfc_app_api_table.cpp
│   │   │   │   └── nfc_app_api_table_i.h
│   │   │   ├── application.fam
│   │   │   ├── cli/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── apdu/
│   │   │   │   │   │   ├── nfc_cli_command_apdu.c
│   │   │   │   │   │   ├── nfc_cli_command_apdu.h
│   │   │   │   │   │   └── protocol_handlers/
│   │   │   │   │   │       ├── iso14443_4a/
│   │   │   │   │   │       │   ├── nfc_cli_apdu_iso14443_4a.c
│   │   │   │   │   │       │   └── nfc_cli_apdu_iso14443_4a.h
│   │   │   │   │   │       ├── iso14443_4b/
│   │   │   │   │   │       │   ├── nfc_cli_apdu_iso14443_4b.c
│   │   │   │   │   │       │   └── nfc_cli_apdu_iso14443_4b.h
│   │   │   │   │   │       ├── iso15693_3/
│   │   │   │   │   │       │   ├── nfc_cli_apdu_iso15693_3.c
│   │   │   │   │   │       │   └── nfc_cli_apdu_iso15693_3.h
│   │   │   │   │   │       └── nfc_cli_apdu_common_types.h
│   │   │   │   │   ├── dump/
│   │   │   │   │   │   ├── nfc_cli_command_dump.c
│   │   │   │   │   │   ├── nfc_cli_command_dump.h
│   │   │   │   │   │   └── protocols/
│   │   │   │   │   │       ├── felica/
│   │   │   │   │   │       │   ├── nfc_cli_dump_felica.c
│   │   │   │   │   │       │   └── nfc_cli_dump_felica.h
│   │   │   │   │   │       ├── iso14443_3a/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_3a.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_3a.h
│   │   │   │   │   │       ├── iso14443_3b/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_3b.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_3b.h
│   │   │   │   │   │       ├── iso14443_4a/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_4a.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_4a.h
│   │   │   │   │   │       ├── iso14443_4b/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso14443_4b.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso14443_4b.h
│   │   │   │   │   │       ├── iso15693_3/
│   │   │   │   │   │       │   ├── nfc_cli_dump_iso15693_3.c
│   │   │   │   │   │       │   └── nfc_cli_dump_iso15693_3.h
│   │   │   │   │   │       ├── mf_classic/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_classic.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_classic.h
│   │   │   │   │   │       ├── mf_desfire/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_desfire.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_desfire.h
│   │   │   │   │   │       ├── mf_plus/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_plus.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_plus.h
│   │   │   │   │   │       ├── mf_ultralight/
│   │   │   │   │   │       │   ├── nfc_cli_dump_mf_ultralight.c
│   │   │   │   │   │       │   └── nfc_cli_dump_mf_ultralight.h
│   │   │   │   │   │       ├── nfc_cli_dump_common_types.h
│   │   │   │   │   │       ├── slix/
│   │   │   │   │   │       │   ├── nfc_cli_dump_slix.c
│   │   │   │   │   │       │   └── nfc_cli_dump_slix.h
│   │   │   │   │   │       └── st25tb/
│   │   │   │   │   │           ├── nfc_cli_dump_st25tb.c
│   │   │   │   │   │           └── nfc_cli_dump_st25tb.h
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── nfc_cli_format.c
│   │   │   │   │   │   ├── nfc_cli_format.h
│   │   │   │   │   │   ├── nfc_cli_protocol_parser.c
│   │   │   │   │   │   ├── nfc_cli_protocol_parser.h
│   │   │   │   │   │   ├── nfc_cli_scanner.c
│   │   │   │   │   │   └── nfc_cli_scanner.h
│   │   │   │   │   ├── mfu/
│   │   │   │   │   │   ├── nfc_cli_action_info.c
│   │   │   │   │   │   ├── nfc_cli_action_info.h
│   │   │   │   │   │   ├── nfc_cli_action_rdbl.c
│   │   │   │   │   │   ├── nfc_cli_action_rdbl.h
│   │   │   │   │   │   ├── nfc_cli_action_wrbl.c
│   │   │   │   │   │   ├── nfc_cli_action_wrbl.h
│   │   │   │   │   │   ├── nfc_cli_command_mfu.c
│   │   │   │   │   │   └── nfc_cli_command_mfu.h
│   │   │   │   │   ├── nfc_cli_command_emulate.c
│   │   │   │   │   ├── nfc_cli_command_emulate.h
│   │   │   │   │   ├── nfc_cli_command_field.c
│   │   │   │   │   ├── nfc_cli_command_field.h
│   │   │   │   │   ├── nfc_cli_command_scanner.c
│   │   │   │   │   ├── nfc_cli_command_scanner.h
│   │   │   │   │   └── raw/
│   │   │   │   │       ├── nfc_cli_command_raw.c
│   │   │   │   │       ├── nfc_cli_command_raw.h
│   │   │   │   │       └── protocol_handlers/
│   │   │   │   │           ├── felica/
│   │   │   │   │           │   ├── nfc_cli_raw_felica.c
│   │   │   │   │           │   └── nfc_cli_raw_felica.h
│   │   │   │   │           ├── iso14443_3a/
│   │   │   │   │           │   ├── nfc_cli_raw_iso14443_3a.c
│   │   │   │   │           │   └── nfc_cli_raw_iso14443_3a.h
│   │   │   │   │           ├── iso14443_3b/
│   │   │   │   │           │   ├── nfc_cli_raw_iso14443_3b.c
│   │   │   │   │           │   └── nfc_cli_raw_iso14443_3b.h
│   │   │   │   │           ├── iso15693_3/
│   │   │   │   │           │   ├── nfc_cli_raw_iso15693_3.c
│   │   │   │   │           │   └── nfc_cli_raw_iso15693_3.h
│   │   │   │   │           └── nfc_cli_raw_common_types.h
│   │   │   │   ├── nfc_cli.c
│   │   │   │   ├── nfc_cli_command_base.h
│   │   │   │   ├── nfc_cli_command_base_i.h
│   │   │   │   ├── nfc_cli_command_processor.c
│   │   │   │   ├── nfc_cli_command_processor.h
│   │   │   │   ├── nfc_cli_commands.c
│   │   │   │   └── nfc_cli_commands.h
│   │   │   ├── helpers/
│   │   │   │   ├── felica_auth.c
│   │   │   │   ├── felica_auth.h
│   │   │   │   ├── mf_classic_key_cache.c
│   │   │   │   ├── mf_classic_key_cache.h
│   │   │   │   ├── mf_ultralight_auth.c
│   │   │   │   ├── mf_ultralight_auth.h
│   │   │   │   ├── mf_user_dict.c
│   │   │   │   ├── mf_user_dict.h
│   │   │   │   ├── mfkey32_logger.c
│   │   │   │   ├── mfkey32_logger.h
│   │   │   │   ├── nfc_custom_event.h
│   │   │   │   ├── nfc_detected_protocols.c
│   │   │   │   ├── nfc_detected_protocols.h
│   │   │   │   ├── nfc_emv_parser.c
│   │   │   │   ├── nfc_emv_parser.h
│   │   │   │   ├── nfc_supported_cards.c
│   │   │   │   ├── nfc_supported_cards.h
│   │   │   │   ├── protocol_support/
│   │   │   │   │   ├── felica/
│   │   │   │   │   │   ├── felica.c
│   │   │   │   │   │   ├── felica.h
│   │   │   │   │   │   ├── felica_render.c
│   │   │   │   │   │   └── felica_render.h
│   │   │   │   │   ├── iso14443_3a/
│   │   │   │   │   │   ├── iso14443_3a.c
│   │   │   │   │   │   ├── iso14443_3a.h
│   │   │   │   │   │   ├── iso14443_3a_render.c
│   │   │   │   │   │   └── iso14443_3a_render.h
│   │   │   │   │   ├── iso14443_3b/
│   │   │   │   │   │   ├── iso14443_3b.c
│   │   │   │   │   │   ├── iso14443_3b.h
│   │   │   │   │   │   ├── iso14443_3b_i.h
│   │   │   │   │   │   ├── iso14443_3b_render.c
│   │   │   │   │   │   └── iso14443_3b_render.h
│   │   │   │   │   ├── iso14443_4a/
│   │   │   │   │   │   ├── iso14443_4a.c
│   │   │   │   │   │   ├── iso14443_4a.h
│   │   │   │   │   │   ├── iso14443_4a_i.h
│   │   │   │   │   │   ├── iso14443_4a_render.c
│   │   │   │   │   │   └── iso14443_4a_render.h
│   │   │   │   │   ├── iso14443_4b/
│   │   │   │   │   │   ├── iso14443_4b.c
│   │   │   │   │   │   ├── iso14443_4b.h
│   │   │   │   │   │   ├── iso14443_4b_render.c
│   │   │   │   │   │   └── iso14443_4b_render.h
│   │   │   │   │   ├── iso15693_3/
│   │   │   │   │   │   ├── iso15693_3.c
│   │   │   │   │   │   ├── iso15693_3.h
│   │   │   │   │   │   ├── iso15693_3_render.c
│   │   │   │   │   │   └── iso15693_3_render.h
│   │   │   │   │   ├── mf_classic/
│   │   │   │   │   │   ├── mf_classic.c
│   │   │   │   │   │   ├── mf_classic.h
│   │   │   │   │   │   ├── mf_classic_render.c
│   │   │   │   │   │   └── mf_classic_render.h
│   │   │   │   │   ├── mf_desfire/
│   │   │   │   │   │   ├── mf_desfire.c
│   │   │   │   │   │   ├── mf_desfire.h
│   │   │   │   │   │   ├── mf_desfire_render.c
│   │   │   │   │   │   └── mf_desfire_render.h
│   │   │   │   │   ├── mf_plus/
│   │   │   │   │   │   ├── mf_plus.c
│   │   │   │   │   │   ├── mf_plus.h
│   │   │   │   │   │   ├── mf_plus_render.c
│   │   │   │   │   │   └── mf_plus_render.h
│   │   │   │   │   ├── mf_ultralight/
│   │   │   │   │   │   ├── mf_ultralight.c
│   │   │   │   │   │   ├── mf_ultralight.h
│   │   │   │   │   │   ├── mf_ultralight_render.c
│   │   │   │   │   │   └── mf_ultralight_render.h
│   │   │   │   │   ├── nfc_protocol_support.c
│   │   │   │   │   ├── nfc_protocol_support.h
│   │   │   │   │   ├── nfc_protocol_support_base.h
│   │   │   │   │   ├── nfc_protocol_support_common.h
│   │   │   │   │   ├── nfc_protocol_support_defs.c
│   │   │   │   │   ├── nfc_protocol_support_defs.h
│   │   │   │   │   ├── nfc_protocol_support_gui_common.c
│   │   │   │   │   ├── nfc_protocol_support_gui_common.h
│   │   │   │   │   ├── nfc_protocol_support_render_common.h
│   │   │   │   │   ├── nfc_protocol_support_unlock_helper.c
│   │   │   │   │   ├── nfc_protocol_support_unlock_helper.h
│   │   │   │   │   ├── slix/
│   │   │   │   │   │   ├── slix.c
│   │   │   │   │   │   ├── slix.h
│   │   │   │   │   │   ├── slix_render.c
│   │   │   │   │   │   └── slix_render.h
│   │   │   │   │   └── st25tb/
│   │   │   │   │       ├── st25tb.c
│   │   │   │   │       ├── st25tb.h
│   │   │   │   │       ├── st25tb_render.c
│   │   │   │   │       └── st25tb_render.h
│   │   │   │   ├── slix_unlock.c
│   │   │   │   └── slix_unlock.h
│   │   │   ├── nfc_app.c
│   │   │   ├── nfc_app.h
│   │   │   ├── nfc_app_i.h
│   │   │   ├── plugins/
│   │   │   │   └── supported_cards/
│   │   │   │       ├── aic.c
│   │   │   │       ├── aime.c
│   │   │   │       ├── all_in_one.c
│   │   │   │       ├── banapass.c
│   │   │   │       ├── bip.c
│   │   │   │       ├── clipper.c
│   │   │   │       ├── disney_infinity.c
│   │   │   │       ├── gallagher.c
│   │   │   │       ├── hi.c
│   │   │   │       ├── hid.c
│   │   │   │       ├── hworld.c
│   │   │   │       ├── itso.c
│   │   │   │       ├── microel.c
│   │   │   │       ├── mizip.c
│   │   │   │       ├── mykey.c
│   │   │   │       ├── myki.c
│   │   │   │       ├── ndef.c
│   │   │   │       ├── nfc_supported_card_plugin.h
│   │   │   │       ├── opal.c
│   │   │   │       ├── plantain.c
│   │   │   │       ├── skylanders.c
│   │   │   │       ├── social_moscow.c
│   │   │   │       ├── troika.c
│   │   │   │       ├── trt.c
│   │   │   │       ├── two_cities.c
│   │   │   │       ├── umarsh.c
│   │   │   │       └── washcity.c
│   │   │   ├── resources/
│   │   │   │   └── nfc/
│   │   │   │       └── assets/
│   │   │   │           ├── aid.nfc
│   │   │   │           ├── country_code.nfc
│   │   │   │           ├── currency_code.nfc
│   │   │   │           ├── mf_classic_dict.nfc
│   │   │   │           ├── mf_ultralight_c_dict.nfc
│   │   │   │           ├── skylanders.nfc
│   │   │   │           └── vendors.nfc
│   │   │   ├── scenes/
│   │   │   │   ├── nfc_scene.c
│   │   │   │   ├── nfc_scene.h
│   │   │   │   ├── nfc_scene_config.h
│   │   │   │   ├── nfc_scene_debug.c
│   │   │   │   ├── nfc_scene_delete.c
│   │   │   │   ├── nfc_scene_delete_success.c
│   │   │   │   ├── nfc_scene_des_auth_key_input.c
│   │   │   │   ├── nfc_scene_des_auth_unlock_warn.c
│   │   │   │   ├── nfc_scene_detect.c
│   │   │   │   ├── nfc_scene_emulate.c
│   │   │   │   ├── nfc_scene_exit_confirm.c
│   │   │   │   ├── nfc_scene_extra_actions.c
│   │   │   │   ├── nfc_scene_felica_more_info.c
│   │   │   │   ├── nfc_scene_felica_system.c
│   │   │   │   ├── nfc_scene_field.c
│   │   │   │   ├── nfc_scene_file_select.c
│   │   │   │   ├── nfc_scene_generate_info.c
│   │   │   │   ├── nfc_scene_info.c
│   │   │   │   ├── nfc_scene_mf_classic_detect_reader.c
│   │   │   │   ├── nfc_scene_mf_classic_dict_attack.c
│   │   │   │   ├── nfc_scene_mf_classic_keys.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_add.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_delete.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_list.c
│   │   │   │   ├── nfc_scene_mf_classic_keys_warn_duplicate.c
│   │   │   │   ├── nfc_scene_mf_classic_mfkey_complete.c
│   │   │   │   ├── nfc_scene_mf_classic_mfkey_nonces_info.c
│   │   │   │   ├── nfc_scene_mf_classic_update_initial.c
│   │   │   │   ├── nfc_scene_mf_classic_update_initial_success.c
│   │   │   │   ├── nfc_scene_mf_classic_update_initial_wrong_card.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial_fail.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial_success.c
│   │   │   │   ├── nfc_scene_mf_classic_write_initial_wrong_card.c
│   │   │   │   ├── nfc_scene_mf_desfire_app.c
│   │   │   │   ├── nfc_scene_mf_desfire_more_info.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_dict_attack.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_add.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_delete.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_list.c
│   │   │   │   ├── nfc_scene_mf_ultralight_c_keys_warn_duplicate.c
│   │   │   │   ├── nfc_scene_mf_ultralight_capture_pass.c
│   │   │   │   ├── nfc_scene_mf_ultralight_key_input.c
│   │   │   │   ├── nfc_scene_mf_ultralight_unlock_menu.c
│   │   │   │   ├── nfc_scene_mf_ultralight_unlock_warn.c
│   │   │   │   ├── nfc_scene_mf_ultralight_write.c
│   │   │   │   ├── nfc_scene_mf_ultralight_write_fail.c
│   │   │   │   ├── nfc_scene_mf_ultralight_write_success.c
│   │   │   │   ├── nfc_scene_mf_ultralight_wrong_card.c
│   │   │   │   ├── nfc_scene_more_info.c
│   │   │   │   ├── nfc_scene_read.c
│   │   │   │   ├── nfc_scene_read_menu.c
│   │   │   │   ├── nfc_scene_read_success.c
│   │   │   │   ├── nfc_scene_restore_original.c
│   │   │   │   ├── nfc_scene_restore_original_confirm.c
│   │   │   │   ├── nfc_scene_retry_confirm.c
│   │   │   │   ├── nfc_scene_rpc.c
│   │   │   │   ├── nfc_scene_save_confirm.c
│   │   │   │   ├── nfc_scene_save_name.c
│   │   │   │   ├── nfc_scene_save_success.c
│   │   │   │   ├── nfc_scene_saved_menu.c
│   │   │   │   ├── nfc_scene_select_protocol.c
│   │   │   │   ├── nfc_scene_set_atqa.c
│   │   │   │   ├── nfc_scene_set_sak.c
│   │   │   │   ├── nfc_scene_set_type.c
│   │   │   │   ├── nfc_scene_set_uid.c
│   │   │   │   ├── nfc_scene_slix_key_input.c
│   │   │   │   ├── nfc_scene_slix_unlock.c
│   │   │   │   ├── nfc_scene_slix_unlock_menu.c
│   │   │   │   ├── nfc_scene_slix_unlock_success.c
│   │   │   │   ├── nfc_scene_start.c
│   │   │   │   └── nfc_scene_supported_card.c
│   │   │   └── views/
│   │   │       ├── detect_reader.c
│   │   │       ├── detect_reader.h
│   │   │       ├── dict_attack.c
│   │   │       └── dict_attack.h
│   │   ├── onewire/
│   │   │   ├── application.fam
│   │   │   └── onewire_cli.c
│   │   ├── subghz/
│   │   │   ├── application.fam
│   │   │   ├── helpers/
│   │   │   │   ├── subghz_chat.c
│   │   │   │   ├── subghz_chat.h
│   │   │   │   ├── subghz_custom_event.h
│   │   │   │   ├── subghz_frequency_analyzer_log_item_array.c
│   │   │   │   ├── subghz_frequency_analyzer_log_item_array.h
│   │   │   │   ├── subghz_frequency_analyzer_worker.c
│   │   │   │   ├── subghz_frequency_analyzer_worker.h
│   │   │   │   ├── subghz_threshold_rssi.c
│   │   │   │   ├── subghz_threshold_rssi.h
│   │   │   │   ├── subghz_txrx.c
│   │   │   │   ├── subghz_txrx.h
│   │   │   │   ├── subghz_txrx_create_protocol_key.c
│   │   │   │   ├── subghz_txrx_create_protocol_key.h
│   │   │   │   ├── subghz_txrx_i.h
│   │   │   │   └── subghz_types.h
│   │   │   ├── resources/
│   │   │   │   └── subghz/
│   │   │   │       └── assets/
│   │   │   │           ├── alutech_at_4n
│   │   │   │           ├── came_atomo
│   │   │   │           ├── keeloq_mfcodes
│   │   │   │           ├── keeloq_mfcodes_user.example
│   │   │   │           ├── nice_flor_s
│   │   │   │           └── setting_user.example
│   │   │   ├── scenes/
│   │   │   │   ├── subghz_scene.c
│   │   │   │   ├── subghz_scene.h
│   │   │   │   ├── subghz_scene_config.h
│   │   │   │   ├── subghz_scene_delete.c
│   │   │   │   ├── subghz_scene_delete_raw.c
│   │   │   │   ├── subghz_scene_delete_success.c
│   │   │   │   ├── subghz_scene_frequency_analyzer.c
│   │   │   │   ├── subghz_scene_more_raw.c
│   │   │   │   ├── subghz_scene_need_saving.c
│   │   │   │   ├── subghz_scene_radio_setting.c
│   │   │   │   ├── subghz_scene_read_raw.c
│   │   │   │   ├── subghz_scene_receiver.c
│   │   │   │   ├── subghz_scene_receiver_config.c
│   │   │   │   ├── subghz_scene_receiver_info.c
│   │   │   │   ├── subghz_scene_region_info.c
│   │   │   │   ├── subghz_scene_rpc.c
│   │   │   │   ├── subghz_scene_save_name.c
│   │   │   │   ├── subghz_scene_save_success.c
│   │   │   │   ├── subghz_scene_saved.c
│   │   │   │   ├── subghz_scene_saved_menu.c
│   │   │   │   ├── subghz_scene_set_type.c
│   │   │   │   ├── subghz_scene_show_error.c
│   │   │   │   ├── subghz_scene_show_error_sub.c
│   │   │   │   ├── subghz_scene_start.c
│   │   │   │   └── subghz_scene_transmitter.c
│   │   │   ├── subghz.c
│   │   │   ├── subghz.h
│   │   │   ├── subghz_cli.c
│   │   │   ├── subghz_cli.h
│   │   │   ├── subghz_history.c
│   │   │   ├── subghz_history.h
│   │   │   ├── subghz_i.c
│   │   │   ├── subghz_i.h
│   │   │   └── views/
│   │   │       ├── receiver.c
│   │   │       ├── receiver.h
│   │   │       ├── subghz_frequency_analyzer.c
│   │   │       ├── subghz_frequency_analyzer.h
│   │   │       ├── subghz_read_raw.c
│   │   │       ├── subghz_read_raw.h
│   │   │       ├── transmitter.c
│   │   │       └── transmitter.h
│   │   └── u2f/
│   │       ├── application.fam
│   │       ├── resources/
│   │       │   └── u2f/
│   │       │       └── assets/
│   │       │           ├── cert.der
│   │       │           └── cert_key.u2f
│   │       ├── scenes/
│   │       │   ├── u2f_scene.c
│   │       │   ├── u2f_scene.h
│   │       │   ├── u2f_scene_config.h
│   │       │   ├── u2f_scene_error.c
│   │       │   └── u2f_scene_main.c
│   │       ├── u2f.c
│   │       ├── u2f.h
│   │       ├── u2f_app.c
│   │       ├── u2f_app.h
│   │       ├── u2f_app_i.h
│   │       ├── u2f_data.c
│   │       ├── u2f_data.h
│   │       ├── u2f_hid.c
│   │       ├── u2f_hid.h
│   │       └── views/
│   │           ├── u2f_view.c
│   │           └── u2f_view.h
│   ├── services/
│   │   ├── application.fam
│   │   ├── applications.h
│   │   ├── bt/
│   │   │   ├── application.fam
│   │   │   ├── bt_cli.c
│   │   │   ├── bt_service/
│   │   │   │   ├── bt.c
│   │   │   │   ├── bt.h
│   │   │   │   ├── bt_api.c
│   │   │   │   ├── bt_i.h
│   │   │   │   ├── bt_keys_filename.h
│   │   │   │   ├── bt_keys_storage.c
│   │   │   │   ├── bt_keys_storage.h
│   │   │   │   └── bt_settings_api_i.h
│   │   │   ├── bt_settings.c
│   │   │   ├── bt_settings.h
│   │   │   └── bt_settings_filename.h
│   │   ├── cli/
│   │   │   ├── application.fam
│   │   │   ├── cli.h
│   │   │   ├── cli_command_gpio.c
│   │   │   ├── cli_command_gpio.h
│   │   │   ├── cli_main_commands.c
│   │   │   ├── cli_main_commands.h
│   │   │   ├── cli_main_shell.c
│   │   │   ├── cli_main_shell.h
│   │   │   ├── cli_vcp.c
│   │   │   ├── cli_vcp.h
│   │   │   └── commands/
│   │   │       ├── buzzer.c
│   │   │       ├── hello_world.c
│   │   │       ├── neofetch.c
│   │   │       └── subshell_demo.c
│   │   ├── crypto/
│   │   │   ├── application.fam
│   │   │   └── crypto_cli.c
│   │   ├── desktop/
│   │   │   ├── animations/
│   │   │   │   ├── animation_manager.c
│   │   │   │   ├── animation_manager.h
│   │   │   │   ├── animation_storage.c
│   │   │   │   ├── animation_storage.h
│   │   │   │   ├── animation_storage_i.h
│   │   │   │   └── views/
│   │   │   │       ├── bubble_animation_view.c
│   │   │   │       ├── bubble_animation_view.h
│   │   │   │       ├── one_shot_animation_view.c
│   │   │   │       └── one_shot_animation_view.h
│   │   │   ├── application.fam
│   │   │   ├── desktop.c
│   │   │   ├── desktop.h
│   │   │   ├── desktop_i.h
│   │   │   ├── desktop_settings.c
│   │   │   ├── desktop_settings.h
│   │   │   ├── desktop_settings_filename.h
│   │   │   ├── helpers/
│   │   │   │   ├── pin_code.c
│   │   │   │   ├── pin_code.h
│   │   │   │   ├── slideshow.c
│   │   │   │   ├── slideshow.h
│   │   │   │   └── slideshow_filename.h
│   │   │   ├── scenes/
│   │   │   │   ├── desktop_scene.c
│   │   │   │   ├── desktop_scene.h
│   │   │   │   ├── desktop_scene_config.h
│   │   │   │   ├── desktop_scene_debug.c
│   │   │   │   ├── desktop_scene_fault.c
│   │   │   │   ├── desktop_scene_hw_mismatch.c
│   │   │   │   ├── desktop_scene_lock_menu.c
│   │   │   │   ├── desktop_scene_locked.c
│   │   │   │   ├── desktop_scene_locked.h
│   │   │   │   ├── desktop_scene_main.c
│   │   │   │   ├── desktop_scene_pin_input.c
│   │   │   │   ├── desktop_scene_pin_timeout.c
│   │   │   │   ├── desktop_scene_secure_enclave.c
│   │   │   │   └── desktop_scene_slideshow.c
│   │   │   └── views/
│   │   │       ├── desktop_events.h
│   │   │       ├── desktop_view_debug.c
│   │   │       ├── desktop_view_debug.h
│   │   │       ├── desktop_view_lock_menu.c
│   │   │       ├── desktop_view_lock_menu.h
│   │   │       ├── desktop_view_locked.c
│   │   │       ├── desktop_view_locked.h
│   │   │       ├── desktop_view_main.c
│   │   │       ├── desktop_view_main.h
│   │   │       ├── desktop_view_pin_input.c
│   │   │       ├── desktop_view_pin_input.h
│   │   │       ├── desktop_view_pin_timeout.c
│   │   │       ├── desktop_view_pin_timeout.h
│   │   │       ├── desktop_view_slideshow.c
│   │   │       └── desktop_view_slideshow.h
│   │   ├── dialogs/
│   │   │   ├── application.fam
│   │   │   ├── dialogs.c
│   │   │   ├── dialogs.h
│   │   │   ├── dialogs_api.c
│   │   │   ├── dialogs_i.h
│   │   │   ├── dialogs_message.h
│   │   │   ├── dialogs_module_file_browser.c
│   │   │   ├── dialogs_module_file_browser.h
│   │   │   ├── dialogs_module_message.c
│   │   │   └── dialogs_module_message.h
│   │   ├── dolphin/
│   │   │   ├── application.fam
│   │   │   ├── dolphin.c
│   │   │   ├── dolphin.h
│   │   │   ├── dolphin_i.h
│   │   │   └── helpers/
│   │   │       ├── dolphin_deed.c
│   │   │       ├── dolphin_deed.h
│   │   │       ├── dolphin_state.c
│   │   │       ├── dolphin_state.h
│   │   │       └── dolphin_state_filename.h
│   │   ├── expansion/
│   │   │   ├── application.fam
│   │   │   ├── expansion.c
│   │   │   ├── expansion.h
│   │   │   ├── expansion_protocol.h
│   │   │   ├── expansion_settings.c
│   │   │   ├── expansion_settings.h
│   │   │   ├── expansion_settings_filename.h
│   │   │   ├── expansion_worker.c
│   │   │   └── expansion_worker.h
│   │   ├── gui/
│   │   │   ├── application.fam
│   │   │   ├── canvas.c
│   │   │   ├── canvas.h
│   │   │   ├── canvas_i.h
│   │   │   ├── elements.c
│   │   │   ├── elements.h
│   │   │   ├── gui.c
│   │   │   ├── gui.h
│   │   │   ├── gui_i.h
│   │   │   ├── icon.c
│   │   │   ├── icon.h
│   │   │   ├── icon_animation.c
│   │   │   ├── icon_animation.h
│   │   │   ├── icon_animation_i.h
│   │   │   ├── icon_i.h
│   │   │   ├── modules/
│   │   │   │   ├── button_menu.c
│   │   │   │   ├── button_menu.h
│   │   │   │   ├── button_panel.c
│   │   │   │   ├── button_panel.h
│   │   │   │   ├── byte_input.c
│   │   │   │   ├── byte_input.h
│   │   │   │   ├── dialog_ex.c
│   │   │   │   ├── dialog_ex.h
│   │   │   │   ├── empty_screen.c
│   │   │   │   ├── empty_screen.h
│   │   │   │   ├── file_browser.c
│   │   │   │   ├── file_browser.h
│   │   │   │   ├── file_browser_worker.c
│   │   │   │   ├── file_browser_worker.h
│   │   │   │   ├── loading.c
│   │   │   │   ├── loading.h
│   │   │   │   ├── menu.c
│   │   │   │   ├── menu.h
│   │   │   │   ├── number_input.c
│   │   │   │   ├── number_input.h
│   │   │   │   ├── popup.c
│   │   │   │   ├── popup.h
│   │   │   │   ├── submenu.c
│   │   │   │   ├── submenu.h
│   │   │   │   ├── text_box.c
│   │   │   │   ├── text_box.h
│   │   │   │   ├── text_input.c
│   │   │   │   ├── text_input.h
│   │   │   │   ├── validators.c
│   │   │   │   ├── validators.h
│   │   │   │   ├── variable_item_list.c
│   │   │   │   ├── variable_item_list.h
│   │   │   │   ├── widget.c
│   │   │   │   ├── widget.h
│   │   │   │   └── widget_elements/
│   │   │   │       ├── widget_element.h
│   │   │   │       ├── widget_element_button.c
│   │   │   │       ├── widget_element_circle.c
│   │   │   │       ├── widget_element_i.h
│   │   │   │       ├── widget_element_icon.c
│   │   │   │       ├── widget_element_line.c
│   │   │   │       ├── widget_element_rect.c
│   │   │   │       ├── widget_element_string.c
│   │   │   │       ├── widget_element_string_multiline.c
│   │   │   │       ├── widget_element_text_box.c
│   │   │   │       └── widget_element_text_scroll.c
│   │   │   ├── scene_manager.c
│   │   │   ├── scene_manager.h
│   │   │   ├── scene_manager_i.h
│   │   │   ├── view.c
│   │   │   ├── view.h
│   │   │   ├── view_dispatcher.c
│   │   │   ├── view_dispatcher.h
│   │   │   ├── view_dispatcher_i.h
│   │   │   ├── view_holder.c
│   │   │   ├── view_holder.h
│   │   │   ├── view_i.h
│   │   │   ├── view_port.c
│   │   │   ├── view_port.h
│   │   │   ├── view_port_i.h
│   │   │   ├── view_stack.c
│   │   │   └── view_stack.h
│   │   ├── input/
│   │   │   ├── application.fam
│   │   │   ├── input.c
│   │   │   ├── input.h
│   │   │   └── input_cli.c
│   │   ├── loader/
│   │   │   ├── application.fam
│   │   │   ├── firmware_api/
│   │   │   │   ├── firmware_api.cpp
│   │   │   │   └── firmware_api.h
│   │   │   ├── loader.c
│   │   │   ├── loader.h
│   │   │   ├── loader_applications.c
│   │   │   ├── loader_applications.h
│   │   │   ├── loader_cli.c
│   │   │   ├── loader_i.h
│   │   │   ├── loader_menu.c
│   │   │   ├── loader_menu.h
│   │   │   ├── loader_queue.c
│   │   │   └── loader_queue.h
│   │   ├── locale/
│   │   │   ├── application.fam
│   │   │   ├── locale.c
│   │   │   └── locale.h
│   │   ├── notification/
│   │   │   ├── application.fam
│   │   │   ├── notification.h
│   │   │   ├── notification_app.c
│   │   │   ├── notification_app.h
│   │   │   ├── notification_app_api.c
│   │   │   ├── notification_messages.c
│   │   │   ├── notification_messages.h
│   │   │   ├── notification_messages_notes.c
│   │   │   ├── notification_messages_notes.h
│   │   │   └── notification_settings_filename.h
│   │   ├── power/
│   │   │   ├── application.fam
│   │   │   ├── power_cli.c
│   │   │   ├── power_cli.h
│   │   │   └── power_service/
│   │   │       ├── power.c
│   │   │       ├── power.h
│   │   │       ├── power_api.c
│   │   │       ├── power_i.h
│   │   │       └── views/
│   │   │           ├── power_off.c
│   │   │           ├── power_off.h
│   │   │           ├── power_unplug_usb.c
│   │   │           └── power_unplug_usb.h
│   │   ├── region/
│   │   │   ├── application.fam
│   │   │   └── region.c
│   │   ├── rpc/
│   │   │   ├── application.fam
│   │   │   ├── rpc.c
│   │   │   ├── rpc.h
│   │   │   ├── rpc_app.c
│   │   │   ├── rpc_app.h
│   │   │   ├── rpc_app_error_codes.h
│   │   │   ├── rpc_cli.c
│   │   │   ├── rpc_debug.c
│   │   │   ├── rpc_desktop.c
│   │   │   ├── rpc_gpio.c
│   │   │   ├── rpc_gui.c
│   │   │   ├── rpc_i.h
│   │   │   ├── rpc_property.c
│   │   │   ├── rpc_storage.c
│   │   │   └── rpc_system.c
│   │   └── storage/
│   │       ├── application.fam
│   │       ├── filesystem_api.c
│   │       ├── filesystem_api_defines.h
│   │       ├── filesystem_api_internal.h
│   │       ├── storage.c
│   │       ├── storage.h
│   │       ├── storage_cli.c
│   │       ├── storage_external_api.c
│   │       ├── storage_glue.c
│   │       ├── storage_glue.h
│   │       ├── storage_i.h
│   │       ├── storage_internal_api.c
│   │       ├── storage_internal_dirname_i.h
│   │       ├── storage_message.h
│   │       ├── storage_processing.c
│   │       ├── storage_processing.h
│   │       ├── storage_sd_api.c
│   │       ├── storage_sd_api.h
│   │       └── storages/
│   │           ├── sd_notify.c
│   │           ├── sd_notify.h
│   │           ├── storage_ext.c
│   │           └── storage_ext.h
│   ├── settings/
│   │   ├── about/
│   │   │   ├── about.c
│   │   │   └── application.fam
│   │   ├── application.fam
│   │   ├── bt_settings_app/
│   │   │   ├── application.fam
│   │   │   ├── bt_settings_app.c
│   │   │   ├── bt_settings_app.h
│   │   │   └── scenes/
│   │   │       ├── bt_settings_scene.c
│   │   │       ├── bt_settings_scene.h
│   │   │       ├── bt_settings_scene_config.h
│   │   │       ├── bt_settings_scene_forget_dev_confirm.c
│   │   │       ├── bt_settings_scene_forget_dev_success.c
│   │   │       └── bt_settings_scene_start.c
│   │   ├── clock_settings/
│   │   │   ├── application.fam
│   │   │   ├── clock_settings.c
│   │   │   ├── clock_settings.h
│   │   │   ├── clock_settings_alarm.c
│   │   │   ├── scenes/
│   │   │   │   ├── clock_settings_scene.c
│   │   │   │   ├── clock_settings_scene.h
│   │   │   │   ├── clock_settings_scene_config.h
│   │   │   │   └── clock_settings_scene_start.c
│   │   │   └── views/
│   │   │       ├── clock_settings_module.c
│   │   │       └── clock_settings_module.h
│   │   ├── desktop_settings/
│   │   │   ├── application.fam
│   │   │   ├── desktop_settings_app.c
│   │   │   ├── desktop_settings_app.h
│   │   │   ├── desktop_settings_custom_event.h
│   │   │   ├── scenes/
│   │   │   │   ├── desktop_settings_scene.c
│   │   │   │   ├── desktop_settings_scene.h
│   │   │   │   ├── desktop_settings_scene_config.h
│   │   │   │   ├── desktop_settings_scene_favorite.c
│   │   │   │   ├── desktop_settings_scene_happy_mode.c
│   │   │   │   ├── desktop_settings_scene_i.h
│   │   │   │   ├── desktop_settings_scene_pin_auth.c
│   │   │   │   ├── desktop_settings_scene_pin_disable.c
│   │   │   │   ├── desktop_settings_scene_pin_error.c
│   │   │   │   ├── desktop_settings_scene_pin_menu.c
│   │   │   │   ├── desktop_settings_scene_pin_setup.c
│   │   │   │   ├── desktop_settings_scene_pin_setup_done.c
│   │   │   │   ├── desktop_settings_scene_pin_setup_howto.c
│   │   │   │   ├── desktop_settings_scene_pin_setup_howto2.c
│   │   │   │   ├── desktop_settings_scene_quick_apps_direction_menu.c
│   │   │   │   ├── desktop_settings_scene_quick_apps_menu.c
│   │   │   │   └── desktop_settings_scene_start.c
│   │   │   └── views/
│   │   │       ├── desktop_settings_view_pin_setup_howto.c
│   │   │       ├── desktop_settings_view_pin_setup_howto.h
│   │   │       ├── desktop_settings_view_pin_setup_howto2.c
│   │   │       └── desktop_settings_view_pin_setup_howto2.h
│   │   ├── dolphin_passport/
│   │   │   ├── application.fam
│   │   │   └── passport.c
│   │   ├── expansion_settings_app/
│   │   │   ├── application.fam
│   │   │   ├── expansion_settings_app.c
│   │   │   └── expansion_settings_app.h
│   │   ├── notification_settings/
│   │   │   ├── application.fam
│   │   │   └── notification_settings_app.c
│   │   ├── power_settings_app/
│   │   │   ├── application.fam
│   │   │   ├── power_settings_app.c
│   │   │   ├── power_settings_app.h
│   │   │   ├── scenes/
│   │   │   │   ├── power_settings_scene.c
│   │   │   │   ├── power_settings_scene.h
│   │   │   │   ├── power_settings_scene_battery_info.c
│   │   │   │   ├── power_settings_scene_config.h
│   │   │   │   ├── power_settings_scene_power_off.c
│   │   │   │   ├── power_settings_scene_reboot.c
│   │   │   │   ├── power_settings_scene_reboot_confirm.c
│   │   │   │   └── power_settings_scene_start.c
│   │   │   └── views/
│   │   │       ├── battery_info.c
│   │   │       └── battery_info.h
│   │   ├── storage_settings/
│   │   │   ├── application.fam
│   │   │   ├── scenes/
│   │   │   │   ├── storage_settings_scene.c
│   │   │   │   ├── storage_settings_scene.h
│   │   │   │   ├── storage_settings_scene_benchmark.c
│   │   │   │   ├── storage_settings_scene_benchmark_confirm.c
│   │   │   │   ├── storage_settings_scene_config.h
│   │   │   │   ├── storage_settings_scene_factory_reset.c
│   │   │   │   ├── storage_settings_scene_format_confirm.c
│   │   │   │   ├── storage_settings_scene_formatting.c
│   │   │   │   ├── storage_settings_scene_internal_info.c
│   │   │   │   ├── storage_settings_scene_sd_info.c
│   │   │   │   ├── storage_settings_scene_start.c
│   │   │   │   ├── storage_settings_scene_unmount_confirm.c
│   │   │   │   └── storage_settings_scene_unmounted.c
│   │   │   ├── storage_settings.c
│   │   │   └── storage_settings.h
│   │   └── system/
│   │       ├── application.fam
│   │       ├── system_settings.c
│   │       └── system_settings.h
│   └── system/
│       ├── application.fam
│       ├── hid_app/
│       │   ├── application.fam
│       │   ├── hid.c
│       │   ├── hid.h
│       │   ├── scenes/
│       │   │   ├── hid_scene.c
│       │   │   ├── hid_scene.h
│       │   │   ├── hid_scene_config.h
│       │   │   ├── hid_scene_main.c
│       │   │   ├── hid_scene_start.c
│       │   │   └── hid_scene_unpair.c
│       │   ├── transport_ble.c
│       │   ├── transport_usb.c
│       │   ├── views/
│       │   │   ├── hid_keyboard.c
│       │   │   ├── hid_keyboard.h
│       │   │   ├── hid_keynote.c
│       │   │   ├── hid_keynote.h
│       │   │   ├── hid_media.c
│       │   │   ├── hid_media.h
│       │   │   ├── hid_mouse.c
│       │   │   ├── hid_mouse.h
│       │   │   ├── hid_mouse_clicker.c
│       │   │   ├── hid_mouse_clicker.h
│       │   │   ├── hid_mouse_jiggler.c
│       │   │   ├── hid_mouse_jiggler.h
│       │   │   ├── hid_tiktok.c
│       │   │   └── hid_tiktok.h
│       │   └── views.h
│       ├── js_app/
│       │   ├── application.fam
│       │   ├── examples/
│       │   │   └── apps/
│       │   │       └── Scripts/
│       │   │           ├── array_buf_test.js
│       │   │           ├── bad_uart.js
│       │   │           ├── badusb_demo.js
│       │   │           ├── console.js
│       │   │           ├── delay.js
│       │   │           ├── event_loop.js
│       │   │           ├── gpio.js
│       │   │           ├── gui.js
│       │   │           ├── interactive.js
│       │   │           ├── load.js
│       │   │           ├── load_api.js
│       │   │           ├── math.js
│       │   │           ├── notify.js
│       │   │           ├── path.js
│       │   │           ├── storage.js
│       │   │           ├── stringutils.js
│       │   │           ├── uart_echo.js
│       │   │           └── uart_echo_8e1.js
│       │   ├── js_app.c
│       │   ├── js_app_i.h
│       │   ├── js_modules.c
│       │   ├── js_modules.h
│       │   ├── js_thread.c
│       │   ├── js_thread.h
│       │   ├── js_thread_i.h
│       │   ├── js_value.c
│       │   ├── js_value.h
│       │   ├── modules/
│       │   │   ├── js_badusb.c
│       │   │   ├── js_event_loop/
│       │   │   │   ├── js_event_loop.c
│       │   │   │   ├── js_event_loop.h
│       │   │   │   ├── js_event_loop_api_table.cpp
│       │   │   │   └── js_event_loop_api_table_i.h
│       │   │   ├── js_flipper.c
│       │   │   ├── js_flipper.h
│       │   │   ├── js_gpio.c
│       │   │   ├── js_gui/
│       │   │   │   ├── button_menu.c
│       │   │   │   ├── button_panel.c
│       │   │   │   ├── byte_input.c
│       │   │   │   ├── dialog.c
│       │   │   │   ├── empty_screen.c
│       │   │   │   ├── file_picker.c
│       │   │   │   ├── icon.c
│       │   │   │   ├── js_gui.c
│       │   │   │   ├── js_gui.h
│       │   │   │   ├── js_gui_api_table.cpp
│       │   │   │   ├── js_gui_api_table_i.h
│       │   │   │   ├── loading.c
│       │   │   │   ├── menu.c
│       │   │   │   ├── number_input.c
│       │   │   │   ├── popup.c
│       │   │   │   ├── submenu.c
│       │   │   │   ├── text_box.c
│       │   │   │   ├── text_input.c
│       │   │   │   ├── vi_list.c
│       │   │   │   └── widget.c
│       │   │   ├── js_math.c
│       │   │   ├── js_notification.c
│       │   │   ├── js_serial.c
│       │   │   ├── js_storage.c
│       │   │   ├── js_tests.c
│       │   │   └── js_tests.h
│       │   ├── packages/
│       │   │   ├── create-fz-app/
│       │   │   │   ├── README.md
│       │   │   │   ├── index.js
│       │   │   │   ├── package.json
│       │   │   │   └── template/
│       │   │   │       ├── .gitignore
│       │   │   │       ├── fz-sdk.config.json5
│       │   │   │       ├── index.ts
│       │   │   │       ├── package.json
│       │   │   │       └── tsconfig.json
│       │   │   └── fz-sdk/
│       │   │       ├── .gitignore
│       │   │       ├── README.md
│       │   │       ├── badusb/
│       │   │       │   └── index.d.ts
│       │   │       ├── docs_readme.md
│       │   │       ├── event_loop/
│       │   │       │   └── index.d.ts
│       │   │       ├── flipper/
│       │   │       │   └── index.d.ts
│       │   │       ├── global.d.ts
│       │   │       ├── gpio/
│       │   │       │   └── index.d.ts
│       │   │       ├── gui/
│       │   │       │   ├── button_menu.d.ts
│       │   │       │   ├── button_panel.d.ts
│       │   │       │   ├── byte_input.d.ts
│       │   │       │   ├── dialog.d.ts
│       │   │       │   ├── empty_screen.d.ts
│       │   │       │   ├── file_picker.d.ts
│       │   │       │   ├── icon.d.ts
│       │   │       │   ├── index.d.ts
│       │   │       │   ├── loading.d.ts
│       │   │       │   ├── menu.d.ts
│       │   │       │   ├── number_input.d.ts
│       │   │       │   ├── popup.d.ts
│       │   │       │   ├── submenu.d.ts
│       │   │       │   ├── text_box.d.ts
│       │   │       │   ├── text_input.d.ts
│       │   │       │   ├── vi_list.d.ts
│       │   │       │   └── widget.d.ts
│       │   │       ├── math/
│       │   │       │   └── index.d.ts
│       │   │       ├── notification/
│       │   │       │   └── index.d.ts
│       │   │       ├── package.json
│       │   │       ├── sdk.js
│       │   │       ├── serial/
│       │   │       │   └── index.d.ts
│       │   │       ├── storage/
│       │   │       │   └── index.d.ts
│       │   │       ├── tests/
│       │   │       │   └── index.d.ts
│       │   │       ├── tsconfig.json
│       │   │       └── typedoc.json
│       │   ├── plugin_api/
│       │   │   ├── app_api_interface.h
│       │   │   ├── app_api_table.cpp
│       │   │   └── app_api_table_i.h
│       │   └── views/
│       │       ├── console_font.h
│       │       ├── console_view.c
│       │       └── console_view.h
│       ├── snake_game/
│       │   ├── application.fam
│       │   └── snake_game.c
│       └── updater/
│           ├── application.fam
│           ├── cli/
│           │   └── updater_cli.c
│           ├── scenes/
│           │   ├── updater_scene.c
│           │   ├── updater_scene.h
│           │   ├── updater_scene_config.h
│           │   ├── updater_scene_error.c
│           │   ├── updater_scene_loadcfg.c
│           │   └── updater_scene_main.c
│           ├── updater.c
│           ├── updater_i.h
│           ├── util/
│           │   ├── update_task.c
│           │   ├── update_task.h
│           │   ├── update_task_i.h
│           │   ├── update_task_worker_backup.c
│           │   └── update_task_worker_flasher.c
│           └── views/
│               ├── updater_main.c
│               └── updater_main.h
├── assets/
│   ├── .gitignore
│   ├── ReadMe.md
│   ├── SConscript
│   ├── dolphin/
│   │   ├── ReadMe.md
│   │   ├── blocking/
│   │   │   ├── L0_NewMail_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_NoDb_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_SdBad_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_SdOk_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L0_Url_128x51/
│   │   │   │   └── meta.txt
│   │   │   └── manifest.txt
│   │   ├── external/
│   │   │   ├── L1_Akira_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Boxing_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Cry_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Doom_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Furippa1_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Kaiju_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Laptop_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Leaving_sad_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Mad_fist_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Mods_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_My_dude_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Painting_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Procrastinating_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Read_books_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Recording_128x51/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Sad_song_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Senpai_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Showtime_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Sleep_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L1_Waves_128x50/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Coding_in_the_shell_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Dj_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Furippa2_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Hacking_pc_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Secret_door_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Soldering_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L2_Wake_up_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Freedom_2_dolphins_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Furippa3_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Hijack_radio_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Intruder_alert_128x64/
│   │   │   │   └── meta.txt
│   │   │   ├── L3_Lab_research_128x54/
│   │   │   │   └── meta.txt
│   │   │   └── manifest.txt
│   │   └── internal/
│   │       ├── L1_BadBattery_128x47/
│   │       │   └── meta.txt
│   │       ├── L1_NoSd_128x49/
│   │       │   └── meta.txt
│   │       ├── L1_Tv_128x47/
│   │       │   └── meta.txt
│   │       └── manifest.txt
│   └── icons/
│       ├── Animations/
│       │   ├── Levelup1_128x64/
│       │   │   └── frame_rate
│       │   └── Levelup2_128x64/
│       │       └── frame_rate
│       ├── Common/
│       │   ├── Loading_24/
│       │   │   └── frame_rate
│       │   └── Round_loader_8x8/
│       │       └── frame_rate
│       ├── MainMenu/
│       │   ├── 125khz_14/
│       │   │   └── frame_rate
│       │   ├── BadUsb_14/
│       │   │   └── frame_rate
│       │   ├── Debug_14/
│       │   │   └── frame_rate
│       │   ├── FileManager_14/
│       │   │   └── frame_rate
│       │   ├── GPIO_14/
│       │   │   └── frame_rate
│       │   ├── Infrared_14/
│       │   │   └── frame_rate
│       │   ├── NFC_14/
│       │   │   └── frame_rate
│       │   ├── Plugins_14/
│       │   │   └── frame_rate
│       │   ├── Settings_14/
│       │   │   └── frame_rate
│       │   ├── Sub1ghz_14/
│       │   │   └── frame_rate
│       │   ├── U2F_14/
│       │   │   └── frame_rate
│       │   └── iButton_14/
│       │       └── frame_rate
│       ├── Settings/
│       │   └── Alarm_47x39/
│       │       └── frame_rate
│       └── SubGhz/
│           ├── SubGhz_External_ant/
│           │   └── frame_rate
│           └── SubGhz_Internal_ant/
│               └── frame_rate
├── documentation/
│   ├── .gitignore
│   ├── AppManifests.md
│   ├── AppsOnSDCard.md
│   ├── ExpansionModules.md
│   ├── FuriCheck.md
│   ├── FuriHalBus.md
│   ├── FuriHalDebugging.md
│   ├── HardwareTargets.md
│   ├── KeyCombo.md
│   ├── LFRFIDRaw.md
│   ├── OTA.md
│   ├── UnitTests.md
│   ├── UniversalRemotes.md
│   ├── devboard/
│   │   ├── Debugging via the Devboard.md
│   │   ├── Devboard debug modes.md
│   │   ├── Firmware update on Developer Board.md
│   │   ├── Get started with the Dev Board.md
│   │   ├── Reading logs via the Dev Board.md
│   │   ├── USB connection to the Devboard.md
│   │   └── Wi-Fi connection to the Devboard.md
│   ├── doxygen/
│   │   ├── Doxyfile-awesome.cfg
│   │   ├── Doxyfile.cfg
│   │   ├── app_publishing.dox
│   │   ├── applications.dox
│   │   ├── dev_board.dox
│   │   ├── dev_tools.dox
│   │   ├── examples.dox
│   │   ├── expansion_modules.dox
│   │   ├── file_formats.dox
│   │   ├── header.html
│   │   ├── index.dox
│   │   ├── js.dox
│   │   ├── misc.dox
│   │   └── system.dox
│   ├── fbt.md
│   ├── file_formats/
│   │   ├── BadUsbScriptFormat.md
│   │   ├── InfraredFileFormats.md
│   │   ├── LfRfidFileFormat.md
│   │   ├── NfcFileFormats.md
│   │   ├── SubGhzFileFormats.md
│   │   ├── TarHeatshrinkFormat.md
│   │   └── iButtonFileFormat.md
│   └── js/
│       ├── js_about.md
│       ├── js_badusb.md
│       ├── js_builtin.md
│       ├── js_data_types.md
│       ├── js_developing_apps_using_js_sdk.md
│       ├── js_event_loop.md
│       ├── js_flipper.md
│       ├── js_gpio.md
│       ├── js_gui.md
│       ├── js_gui__byte_input.md
│       ├── js_gui__dialog.md
│       ├── js_gui__empty_screen.md
│       ├── js_gui__file_picker.md
│       ├── js_gui__icon.md
│       ├── js_gui__loading.md
│       ├── js_gui__submenu.md
│       ├── js_gui__text_box.md
│       ├── js_gui__text_input.md
│       ├── js_gui__widget.md
│       ├── js_math.md
│       ├── js_notification.md
│       ├── js_serial.md
│       ├── js_storage.md
│       ├── js_using_js_modules.md
│       └── js_your_first_js_app.md
├── fbt
├── fbt.cmd
├── fbt_options.py
├── firmware.scons
├── furi/
│   ├── SConscript
│   ├── core/
│   │   ├── base.h
│   │   ├── check.c
│   │   ├── check.h
│   │   ├── common_defines.h
│   │   ├── core_defines.h
│   │   ├── critical.c
│   │   ├── dangerous_defines.h
│   │   ├── event_flag.c
│   │   ├── event_flag.h
│   │   ├── event_loop.c
│   │   ├── event_loop.h
│   │   ├── event_loop_i.h
│   │   ├── event_loop_link_i.h
│   │   ├── event_loop_thread_flag_interface.h
│   │   ├── event_loop_tick.c
│   │   ├── event_loop_tick_i.h
│   │   ├── event_loop_timer.c
│   │   ├── event_loop_timer.h
│   │   ├── event_loop_timer_i.h
│   │   ├── kernel.c
│   │   ├── kernel.h
│   │   ├── log.c
│   │   ├── log.h
│   │   ├── memmgr.c
│   │   ├── memmgr.h
│   │   ├── memmgr_heap.c
│   │   ├── memmgr_heap.h
│   │   ├── message_queue.c
│   │   ├── message_queue.h
│   │   ├── mutex.c
│   │   ├── mutex.h
│   │   ├── pubsub.c
│   │   ├── pubsub.h
│   │   ├── record.c
│   │   ├── record.h
│   │   ├── semaphore.c
│   │   ├── semaphore.h
│   │   ├── stream_buffer.c
│   │   ├── stream_buffer.h
│   │   ├── string.c
│   │   ├── string.h
│   │   ├── thread.c
│   │   ├── thread.h
│   │   ├── thread_i.h
│   │   ├── thread_list.c
│   │   ├── thread_list.h
│   │   ├── thread_list_i.h
│   │   ├── timer.c
│   │   └── timer.h
│   ├── flipper.c
│   ├── flipper.h
│   ├── furi.c
│   └── furi.h
├── lib/
│   ├── FreeRTOS-glue/
│   │   └── task_control_block.h
│   ├── ReadMe.md
│   ├── SConscript
│   ├── bit_lib/
│   │   ├── SConscript
│   │   ├── bit_lib.c
│   │   └── bit_lib.h
│   ├── ble_profile/
│   │   ├── SConscript
│   │   ├── extra_profiles/
│   │   │   ├── hid_profile.c
│   │   │   └── hid_profile.h
│   │   └── extra_services/
│   │       ├── hid_service.c
│   │       └── hid_service.h
│   ├── cmsis_core/
│   │   ├── cmsis_armcc.h
│   │   ├── cmsis_armclang.h
│   │   ├── cmsis_armclang_ltm.h
│   │   ├── cmsis_compiler.h
│   │   ├── cmsis_gcc.h
│   │   ├── cmsis_iccarm.h
│   │   ├── cmsis_tiarmclang.h
│   │   ├── cmsis_version.h
│   │   ├── core_cm4.h
│   │   └── mpu_armv7.h
│   ├── datetime/
│   │   ├── SConscript
│   │   ├── datetime.c
│   │   └── datetime.h
│   ├── digital_signal/
│   │   ├── SConscript
│   │   ├── digital_sequence.c
│   │   ├── digital_sequence.h
│   │   ├── digital_signal.c
│   │   ├── digital_signal.h
│   │   ├── digital_signal_i.h
│   │   └── presets/
│   │       └── nfc/
│   │           ├── iso14443_3a_signal.c
│   │           ├── iso14443_3a_signal.h
│   │           ├── iso15693_signal.c
│   │           └── iso15693_signal.h
│   ├── drivers/
│   │   ├── SConscript
│   │   ├── bq25896.c
│   │   ├── bq25896.h
│   │   ├── bq25896_reg.h
│   │   ├── bq27220.c
│   │   ├── bq27220.h
│   │   ├── bq27220_data_memory.h
│   │   ├── bq27220_reg.h
│   │   ├── cc1101.c
│   │   ├── cc1101.h
│   │   ├── cc1101_regs.h
│   │   ├── lp5562.c
│   │   ├── lp5562.h
│   │   ├── lp5562_reg.h
│   │   ├── st25r3916.c
│   │   ├── st25r3916.h
│   │   ├── st25r3916_reg.c
│   │   └── st25r3916_reg.h
│   ├── err.h
│   ├── fatfs/
│   │   ├── SConscript
│   │   ├── diskio.c
│   │   ├── diskio.h
│   │   ├── ff.c
│   │   ├── ff.h
│   │   ├── ff_gen_drv.c
│   │   ├── ff_gen_drv.h
│   │   ├── ffconf_template.h
│   │   ├── integer.h
│   │   └── option/
│   │       ├── cc932.c
│   │       ├── cc936.c
│   │       ├── cc949.c
│   │       ├── cc950.c
│   │       ├── ccsbcs.c
│   │       └── unicode.c
│   ├── flipper_application/
│   │   ├── SConscript
│   │   ├── api_hashtable/
│   │   │   ├── api_hashtable.cpp
│   │   │   ├── api_hashtable.h
│   │   │   └── compilesort.hpp
│   │   ├── application_assets.c
│   │   ├── application_assets.h
│   │   ├── application_manifest.c
│   │   ├── application_manifest.h
│   │   ├── elf/
│   │   │   ├── elf.h
│   │   │   ├── elf_api_interface.h
│   │   │   ├── elf_file.c
│   │   │   ├── elf_file.h
│   │   │   └── elf_file_i.h
│   │   ├── flipper_application.c
│   │   ├── flipper_application.h
│   │   └── plugins/
│   │       ├── composite_resolver.c
│   │       ├── composite_resolver.h
│   │       ├── plugin_manager.c
│   │       └── plugin_manager.h
│   ├── flipper_format/
│   │   ├── SConscript
│   │   ├── flipper_format.c
│   │   ├── flipper_format.h
│   │   ├── flipper_format_i.h
│   │   ├── flipper_format_stream.c
│   │   ├── flipper_format_stream.h
│   │   └── flipper_format_stream_i.h
│   ├── freertos.scons
│   ├── heatshrink.scons
│   ├── ibutton/
│   │   ├── SConscript
│   │   ├── ibutton_key.c
│   │   ├── ibutton_key.h
│   │   ├── ibutton_key_i.h
│   │   ├── ibutton_protocols.c
│   │   ├── ibutton_protocols.h
│   │   ├── ibutton_worker.c
│   │   ├── ibutton_worker.h
│   │   ├── ibutton_worker_i.h
│   │   ├── ibutton_worker_modes.c
│   │   └── protocols/
│   │       ├── blanks/
│   │       │   ├── rw1990.c
│   │       │   ├── rw1990.h
│   │       │   ├── tm01x.c
│   │       │   ├── tm01x.h
│   │       │   ├── tm2004.c
│   │       │   └── tm2004.h
│   │       ├── dallas/
│   │       │   ├── dallas_common.c
│   │       │   ├── dallas_common.h
│   │       │   ├── protocol_dallas_base.h
│   │       │   ├── protocol_ds1971.c
│   │       │   ├── protocol_ds1971.h
│   │       │   ├── protocol_ds1990.c
│   │       │   ├── protocol_ds1990.h
│   │       │   ├── protocol_ds1992.c
│   │       │   ├── protocol_ds1992.h
│   │       │   ├── protocol_ds1996.c
│   │       │   ├── protocol_ds1996.h
│   │       │   ├── protocol_ds_generic.c
│   │       │   ├── protocol_ds_generic.h
│   │       │   ├── protocol_group_dallas.c
│   │       │   ├── protocol_group_dallas.h
│   │       │   ├── protocol_group_dallas_defs.c
│   │       │   └── protocol_group_dallas_defs.h
│   │       ├── misc/
│   │       │   ├── protocol_cyfral.c
│   │       │   ├── protocol_cyfral.h
│   │       │   ├── protocol_group_misc.c
│   │       │   ├── protocol_group_misc.h
│   │       │   ├── protocol_group_misc_defs.c
│   │       │   ├── protocol_group_misc_defs.h
│   │       │   ├── protocol_metakom.c
│   │       │   └── protocol_metakom.h
│   │       ├── protocol_common.h
│   │       ├── protocol_common_i.h
│   │       ├── protocol_group_base.h
│   │       ├── protocol_group_defs.c
│   │       └── protocol_group_defs.h
│   ├── ieee754_parse_wrap/
│   │   ├── SConscript
│   │   ├── wrappers.c
│   │   └── wrappers.h
│   ├── infrared/
│   │   ├── SConscript
│   │   ├── encoder_decoder/
│   │   │   ├── common/
│   │   │   │   ├── infrared_common_decoder.c
│   │   │   │   ├── infrared_common_encoder.c
│   │   │   │   └── infrared_common_i.h
│   │   │   ├── infrared.c
│   │   │   ├── infrared.h
│   │   │   ├── infrared_i.h
│   │   │   ├── kaseikyo/
│   │   │   │   ├── infrared_decoder_kaseikyo.c
│   │   │   │   ├── infrared_encoder_kaseikyo.c
│   │   │   │   ├── infrared_protocol_kaseikyo.c
│   │   │   │   ├── infrared_protocol_kaseikyo.h
│   │   │   │   └── infrared_protocol_kaseikyo_i.h
│   │   │   ├── nec/
│   │   │   │   ├── infrared_decoder_nec.c
│   │   │   │   ├── infrared_encoder_nec.c
│   │   │   │   ├── infrared_protocol_nec.c
│   │   │   │   ├── infrared_protocol_nec.h
│   │   │   │   └── infrared_protocol_nec_i.h
│   │   │   ├── pioneer/
│   │   │   │   ├── infrared_decoder_pioneer.c
│   │   │   │   ├── infrared_encoder_pioneer.c
│   │   │   │   ├── infrared_protocol_pioneer.c
│   │   │   │   ├── infrared_protocol_pioneer.h
│   │   │   │   └── infrared_protocol_pioneer_i.h
│   │   │   ├── rc5/
│   │   │   │   ├── infrared_decoder_rc5.c
│   │   │   │   ├── infrared_encoder_rc5.c
│   │   │   │   ├── infrared_protocol_rc5.c
│   │   │   │   ├── infrared_protocol_rc5.h
│   │   │   │   └── infrared_protocol_rc5_i.h
│   │   │   ├── rc6/
│   │   │   │   ├── infrared_decoder_rc6.c
│   │   │   │   ├── infrared_encoder_rc6.c
│   │   │   │   ├── infrared_protocol_rc6.c
│   │   │   │   ├── infrared_protocol_rc6.h
│   │   │   │   └── infrared_protocol_rc6_i.h
│   │   │   ├── rca/
│   │   │   │   ├── infrared_decoder_rca.c
│   │   │   │   ├── infrared_encoder_rca.c
│   │   │   │   ├── infrared_protocol_rca.c
│   │   │   │   ├── infrared_protocol_rca.h
│   │   │   │   └── infrared_protocol_rca_i.h
│   │   │   ├── samsung/
│   │   │   │   ├── infrared_decoder_samsung.c
│   │   │   │   ├── infrared_encoder_samsung.c
│   │   │   │   ├── infrared_protocol_samsung.c
│   │   │   │   ├── infrared_protocol_samsung.h
│   │   │   │   └── infrared_protocol_samsung_i.h
│   │   │   └── sirc/
│   │   │       ├── infrared_decoder_sirc.c
│   │   │       ├── infrared_encoder_sirc.c
│   │   │       ├── infrared_protocol_sirc.c
│   │   │       ├── infrared_protocol_sirc.h
│   │   │       └── infrared_protocol_sirc_i.h
│   │   ├── signal/
│   │   │   ├── infrared_brute_force.c
│   │   │   ├── infrared_brute_force.h
│   │   │   ├── infrared_error_code.h
│   │   │   ├── infrared_signal.c
│   │   │   └── infrared_signal.h
│   │   └── worker/
│   │       ├── infrared_transmit.c
│   │       ├── infrared_transmit.h
│   │       ├── infrared_worker.c
│   │       └── infrared_worker.h
│   ├── lfrfid/
│   │   ├── SConscript
│   │   ├── lfrfid_dict_file.c
│   │   ├── lfrfid_dict_file.h
│   │   ├── lfrfid_raw_file.c
│   │   ├── lfrfid_raw_file.h
│   │   ├── lfrfid_raw_worker.c
│   │   ├── lfrfid_raw_worker.h
│   │   ├── lfrfid_worker.c
│   │   ├── lfrfid_worker.h
│   │   ├── lfrfid_worker_i.h
│   │   ├── lfrfid_worker_modes.c
│   │   ├── protocols/
│   │   │   ├── lfrfid_protocols.c
│   │   │   ├── lfrfid_protocols.h
│   │   │   ├── protocol_awid.c
│   │   │   ├── protocol_awid.h
│   │   │   ├── protocol_electra.c
│   │   │   ├── protocol_electra.h
│   │   │   ├── protocol_em4100.c
│   │   │   ├── protocol_em4100.h
│   │   │   ├── protocol_fdx_a.c
│   │   │   ├── protocol_fdx_a.h
│   │   │   ├── protocol_fdx_b.c
│   │   │   ├── protocol_fdx_b.h
│   │   │   ├── protocol_gallagher.c
│   │   │   ├── protocol_gallagher.h
│   │   │   ├── protocol_gproxii.c
│   │   │   ├── protocol_gproxii.h
│   │   │   ├── protocol_h10301.c
│   │   │   ├── protocol_h10301.h
│   │   │   ├── protocol_hid_ex_generic.c
│   │   │   ├── protocol_hid_ex_generic.h
│   │   │   ├── protocol_hid_generic.c
│   │   │   ├── protocol_hid_generic.h
│   │   │   ├── protocol_idteck.c
│   │   │   ├── protocol_idteck.h
│   │   │   ├── protocol_indala26.c
│   │   │   ├── protocol_indala26.h
│   │   │   ├── protocol_io_prox_xsf.c
│   │   │   ├── protocol_io_prox_xsf.h
│   │   │   ├── protocol_jablotron.c
│   │   │   ├── protocol_jablotron.h
│   │   │   ├── protocol_keri.c
│   │   │   ├── protocol_keri.h
│   │   │   ├── protocol_nexwatch.c
│   │   │   ├── protocol_nexwatch.h
│   │   │   ├── protocol_noralsy.c
│   │   │   ├── protocol_noralsy.h
│   │   │   ├── protocol_pac_stanley.c
│   │   │   ├── protocol_pac_stanley.h
│   │   │   ├── protocol_paradox.c
│   │   │   ├── protocol_paradox.h
│   │   │   ├── protocol_pyramid.c
│   │   │   ├── protocol_pyramid.h
│   │   │   ├── protocol_securakey.c
│   │   │   ├── protocol_securakey.h
│   │   │   ├── protocol_viking.c
│   │   │   └── protocol_viking.h
│   │   └── tools/
│   │       ├── em4305.c
│   │       ├── em4305.h
│   │       ├── fsk_demod.c
│   │       ├── fsk_demod.h
│   │       ├── fsk_ocs.c
│   │       ├── fsk_osc.h
│   │       ├── iso_3166.c
│   │       ├── iso_3166.h
│   │       ├── t5577.c
│   │       ├── t5577.h
│   │       ├── varint_pair.c
│   │       └── varint_pair.h
│   ├── libusb_stm32.scons
│   ├── mbedtls.scons
│   ├── mbedtls_cfg.h
│   ├── microtar.scons
│   ├── mjs/
│   │   ├── SConscript
│   │   ├── common/
│   │   │   ├── cs_dbg.c
│   │   │   ├── cs_dbg.h
│   │   │   ├── cs_dirent.c
│   │   │   ├── cs_dirent.h
│   │   │   ├── cs_file.c
│   │   │   ├── cs_file.h
│   │   │   ├── cs_time.c
│   │   │   ├── cs_time.h
│   │   │   ├── cs_varint.c
│   │   │   ├── cs_varint.h
│   │   │   ├── frozen/
│   │   │   │   ├── frozen.c
│   │   │   │   └── frozen.h
│   │   │   ├── mbuf.c
│   │   │   ├── mbuf.h
│   │   │   ├── mg_mem.h
│   │   │   ├── mg_str.c
│   │   │   ├── mg_str.h
│   │   │   ├── platform.h
│   │   │   ├── platforms/
│   │   │   │   ├── platform_flipper.c
│   │   │   │   └── platform_flipper.h
│   │   │   ├── str_util.c
│   │   │   └── str_util.h
│   │   ├── ffi/
│   │   │   ├── ffi.c
│   │   │   └── ffi.h
│   │   ├── mjs_array.c
│   │   ├── mjs_array.h
│   │   ├── mjs_array_buf.c
│   │   ├── mjs_array_buf.h
│   │   ├── mjs_array_buf_public.h
│   │   ├── mjs_array_public.h
│   │   ├── mjs_bcode.c
│   │   ├── mjs_bcode.h
│   │   ├── mjs_builtin.c
│   │   ├── mjs_builtin.h
│   │   ├── mjs_core.c
│   │   ├── mjs_core.h
│   │   ├── mjs_core_public.h
│   │   ├── mjs_dataview.c
│   │   ├── mjs_dataview.h
│   │   ├── mjs_exec.c
│   │   ├── mjs_exec.h
│   │   ├── mjs_exec_public.h
│   │   ├── mjs_features.h
│   │   ├── mjs_ffi.c
│   │   ├── mjs_ffi.h
│   │   ├── mjs_ffi_public.h
│   │   ├── mjs_gc.c
│   │   ├── mjs_gc.h
│   │   ├── mjs_gc_public.h
│   │   ├── mjs_internal.h
│   │   ├── mjs_json.c
│   │   ├── mjs_json.h
│   │   ├── mjs_license.h
│   │   ├── mjs_mm.h
│   │   ├── mjs_object.c
│   │   ├── mjs_object.h
│   │   ├── mjs_object_public.h
│   │   ├── mjs_parser.c
│   │   ├── mjs_parser.h
│   │   ├── mjs_primitive.c
│   │   ├── mjs_primitive.h
│   │   ├── mjs_primitive_public.h
│   │   ├── mjs_string.c
│   │   ├── mjs_string.h
│   │   ├── mjs_string_public.h
│   │   ├── mjs_tok.c
│   │   ├── mjs_tok.h
│   │   ├── mjs_util.c
│   │   ├── mjs_util.h
│   │   └── mjs_util_public.h
│   ├── mlib.scons
│   ├── music_worker/
│   │   ├── SConscript
│   │   ├── music_worker.c
│   │   └── music_worker.h
│   ├── nanopb.scons
│   ├── nfc/
│   │   ├── SConscript
│   │   ├── helpers/
│   │   │   ├── crypto1.c
│   │   │   ├── crypto1.h
│   │   │   ├── felica_crc.c
│   │   │   ├── felica_crc.h
│   │   │   ├── iso13239_crc.c
│   │   │   ├── iso13239_crc.h
│   │   │   ├── iso14443_4_layer.c
│   │   │   ├── iso14443_4_layer.h
│   │   │   ├── iso14443_crc.c
│   │   │   ├── iso14443_crc.h
│   │   │   ├── nfc_data_generator.c
│   │   │   ├── nfc_data_generator.h
│   │   │   ├── nfc_util.c
│   │   │   └── nfc_util.h
│   │   ├── nfc.c
│   │   ├── nfc.h
│   │   ├── nfc_common.h
│   │   ├── nfc_device.c
│   │   ├── nfc_device.h
│   │   ├── nfc_device_i.c
│   │   ├── nfc_device_i.h
│   │   ├── nfc_listener.c
│   │   ├── nfc_listener.h
│   │   ├── nfc_mock.c
│   │   ├── nfc_poller.c
│   │   ├── nfc_poller.h
│   │   ├── nfc_scanner.c
│   │   ├── nfc_scanner.h
│   │   └── protocols/
│   │       ├── felica/
│   │       │   ├── felica.c
│   │       │   ├── felica.h
│   │       │   ├── felica_i.c
│   │       │   ├── felica_i.h
│   │       │   ├── felica_listener.c
│   │       │   ├── felica_listener.h
│   │       │   ├── felica_listener_defs.h
│   │       │   ├── felica_listener_i.c
│   │       │   ├── felica_listener_i.h
│   │       │   ├── felica_poller.c
│   │       │   ├── felica_poller.h
│   │       │   ├── felica_poller_defs.h
│   │       │   ├── felica_poller_i.c
│   │       │   ├── felica_poller_i.h
│   │       │   ├── felica_poller_sync.c
│   │       │   └── felica_poller_sync.h
│   │       ├── iso14443_3a/
│   │       │   ├── iso14443_3a.c
│   │       │   ├── iso14443_3a.h
│   │       │   ├── iso14443_3a_device_defs.h
│   │       │   ├── iso14443_3a_listener.c
│   │       │   ├── iso14443_3a_listener.h
│   │       │   ├── iso14443_3a_listener_defs.h
│   │       │   ├── iso14443_3a_listener_i.c
│   │       │   ├── iso14443_3a_listener_i.h
│   │       │   ├── iso14443_3a_poller.c
│   │       │   ├── iso14443_3a_poller.h
│   │       │   ├── iso14443_3a_poller_defs.h
│   │       │   ├── iso14443_3a_poller_i.c
│   │       │   ├── iso14443_3a_poller_i.h
│   │       │   ├── iso14443_3a_poller_sync.c
│   │       │   └── iso14443_3a_poller_sync.h
│   │       ├── iso14443_3b/
│   │       │   ├── iso14443_3b.c
│   │       │   ├── iso14443_3b.h
│   │       │   ├── iso14443_3b_device_defs.h
│   │       │   ├── iso14443_3b_i.h
│   │       │   ├── iso14443_3b_poller.c
│   │       │   ├── iso14443_3b_poller.h
│   │       │   ├── iso14443_3b_poller_defs.h
│   │       │   ├── iso14443_3b_poller_i.c
│   │       │   └── iso14443_3b_poller_i.h
│   │       ├── iso14443_4a/
│   │       │   ├── iso14443_4a.c
│   │       │   ├── iso14443_4a.h
│   │       │   ├── iso14443_4a_device_defs.h
│   │       │   ├── iso14443_4a_i.c
│   │       │   ├── iso14443_4a_i.h
│   │       │   ├── iso14443_4a_listener.c
│   │       │   ├── iso14443_4a_listener.h
│   │       │   ├── iso14443_4a_listener_defs.h
│   │       │   ├── iso14443_4a_listener_i.c
│   │       │   ├── iso14443_4a_listener_i.h
│   │       │   ├── iso14443_4a_poller.c
│   │       │   ├── iso14443_4a_poller.h
│   │       │   ├── iso14443_4a_poller_defs.h
│   │       │   ├── iso14443_4a_poller_i.c
│   │       │   └── iso14443_4a_poller_i.h
│   │       ├── iso14443_4b/
│   │       │   ├── iso14443_4b.c
│   │       │   ├── iso14443_4b.h
│   │       │   ├── iso14443_4b_device_defs.h
│   │       │   ├── iso14443_4b_i.c
│   │       │   ├── iso14443_4b_i.h
│   │       │   ├── iso14443_4b_poller.c
│   │       │   ├── iso14443_4b_poller.h
│   │       │   ├── iso14443_4b_poller_defs.h
│   │       │   ├── iso14443_4b_poller_i.c
│   │       │   └── iso14443_4b_poller_i.h
│   │       ├── iso15693_3/
│   │       │   ├── iso15693_3.c
│   │       │   ├── iso15693_3.h
│   │       │   ├── iso15693_3_device_defs.h
│   │       │   ├── iso15693_3_i.c
│   │       │   ├── iso15693_3_i.h
│   │       │   ├── iso15693_3_listener.c
│   │       │   ├── iso15693_3_listener.h
│   │       │   ├── iso15693_3_listener_defs.h
│   │       │   ├── iso15693_3_listener_i.c
│   │       │   ├── iso15693_3_listener_i.h
│   │       │   ├── iso15693_3_poller.c
│   │       │   ├── iso15693_3_poller.h
│   │       │   ├── iso15693_3_poller_defs.h
│   │       │   ├── iso15693_3_poller_i.c
│   │       │   └── iso15693_3_poller_i.h
│   │       ├── mf_classic/
│   │       │   ├── mf_classic.c
│   │       │   ├── mf_classic.h
│   │       │   ├── mf_classic_listener.c
│   │       │   ├── mf_classic_listener.h
│   │       │   ├── mf_classic_listener_defs.h
│   │       │   ├── mf_classic_listener_i.h
│   │       │   ├── mf_classic_poller.c
│   │       │   ├── mf_classic_poller.h
│   │       │   ├── mf_classic_poller_defs.h
│   │       │   ├── mf_classic_poller_i.c
│   │       │   ├── mf_classic_poller_i.h
│   │       │   ├── mf_classic_poller_sync.c
│   │       │   └── mf_classic_poller_sync.h
│   │       ├── mf_desfire/
│   │       │   ├── mf_desfire.c
│   │       │   ├── mf_desfire.h
│   │       │   ├── mf_desfire_i.c
│   │       │   ├── mf_desfire_i.h
│   │       │   ├── mf_desfire_poller.c
│   │       │   ├── mf_desfire_poller.h
│   │       │   ├── mf_desfire_poller_defs.h
│   │       │   ├── mf_desfire_poller_i.c
│   │       │   └── mf_desfire_poller_i.h
│   │       ├── mf_plus/
│   │       │   ├── mf_plus.c
│   │       │   ├── mf_plus.h
│   │       │   ├── mf_plus_i.c
│   │       │   ├── mf_plus_i.h
│   │       │   ├── mf_plus_poller.c
│   │       │   ├── mf_plus_poller.h
│   │       │   ├── mf_plus_poller_defs.h
│   │       │   ├── mf_plus_poller_i.c
│   │       │   └── mf_plus_poller_i.h
│   │       ├── mf_ultralight/
│   │       │   ├── mf_ultralight.c
│   │       │   ├── mf_ultralight.h
│   │       │   ├── mf_ultralight_listener.c
│   │       │   ├── mf_ultralight_listener.h
│   │       │   ├── mf_ultralight_listener_defs.h
│   │       │   ├── mf_ultralight_listener_i.c
│   │       │   ├── mf_ultralight_listener_i.h
│   │       │   ├── mf_ultralight_poller.c
│   │       │   ├── mf_ultralight_poller.h
│   │       │   ├── mf_ultralight_poller_defs.h
│   │       │   ├── mf_ultralight_poller_i.c
│   │       │   ├── mf_ultralight_poller_i.h
│   │       │   ├── mf_ultralight_poller_sync.c
│   │       │   └── mf_ultralight_poller_sync.h
│   │       ├── nfc_device_base.h
│   │       ├── nfc_device_base_i.h
│   │       ├── nfc_device_defs.c
│   │       ├── nfc_device_defs.h
│   │       ├── nfc_generic_event.h
│   │       ├── nfc_listener_base.h
│   │       ├── nfc_listener_defs.c
│   │       ├── nfc_listener_defs.h
│   │       ├── nfc_poller_base.h
│   │       ├── nfc_poller_defs.c
│   │       ├── nfc_poller_defs.h
│   │       ├── nfc_protocol.c
│   │       ├── nfc_protocol.h
│   │       ├── slix/
│   │       │   ├── slix.c
│   │       │   ├── slix.h
│   │       │   ├── slix_device_defs.h
│   │       │   ├── slix_i.c
│   │       │   ├── slix_i.h
│   │       │   ├── slix_listener.c
│   │       │   ├── slix_listener.h
│   │       │   ├── slix_listener_defs.h
│   │       │   ├── slix_listener_i.c
│   │       │   ├── slix_listener_i.h
│   │       │   ├── slix_poller.c
│   │       │   ├── slix_poller.h
│   │       │   ├── slix_poller_defs.h
│   │       │   ├── slix_poller_i.c
│   │       │   └── slix_poller_i.h
│   │       └── st25tb/
│   │           ├── st25tb.c
│   │           ├── st25tb.h
│   │           ├── st25tb_poller.c
│   │           ├── st25tb_poller.h
│   │           ├── st25tb_poller_defs.h
│   │           ├── st25tb_poller_i.c
│   │           ├── st25tb_poller_i.h
│   │           ├── st25tb_poller_sync.c
│   │           └── st25tb_poller_sync.h
│   ├── one_wire/
│   │   ├── SConscript
│   │   ├── maxim_crc.c
│   │   ├── maxim_crc.h
│   │   ├── one_wire_host.c
│   │   ├── one_wire_host.h
│   │   ├── one_wire_slave.c
│   │   └── one_wire_slave.h
│   ├── print/
│   │   ├── SConscript
│   │   ├── printf_tiny.c
│   │   ├── printf_tiny.h
│   │   ├── wrappers.c
│   │   └── wrappers.h
│   ├── pulse_reader/
│   │   ├── SConscript
│   │   ├── pulse_reader.c
│   │   └── pulse_reader.h
│   ├── signal_reader/
│   │   ├── SConscript
│   │   ├── parsers/
│   │   │   └── iso15693/
│   │   │       ├── iso15693_parser.c
│   │   │       └── iso15693_parser.h
│   │   ├── signal_reader.c
│   │   └── signal_reader.h
│   ├── stm32wb.scons
│   ├── subghz/
│   │   ├── SConscript
│   │   ├── blocks/
│   │   │   ├── const.h
│   │   │   ├── decoder.c
│   │   │   ├── decoder.h
│   │   │   ├── encoder.c
│   │   │   ├── encoder.h
│   │   │   ├── generic.c
│   │   │   ├── generic.h
│   │   │   ├── math.c
│   │   │   └── math.h
│   │   ├── devices/
│   │   │   ├── cc1101_configs.c
│   │   │   ├── cc1101_configs.h
│   │   │   ├── cc1101_int/
│   │   │   │   ├── cc1101_int_interconnect.c
│   │   │   │   └── cc1101_int_interconnect.h
│   │   │   ├── device_registry.h
│   │   │   ├── devices.c
│   │   │   ├── devices.h
│   │   │   ├── preset.h
│   │   │   ├── registry.c
│   │   │   ├── registry.h
│   │   │   └── types.h
│   │   ├── environment.c
│   │   ├── environment.h
│   │   ├── protocols/
│   │   │   ├── alutech_at_4n.c
│   │   │   ├── alutech_at_4n.h
│   │   │   ├── ansonic.c
│   │   │   ├── ansonic.h
│   │   │   ├── base.c
│   │   │   ├── base.h
│   │   │   ├── bett.c
│   │   │   ├── bett.h
│   │   │   ├── bin_raw.c
│   │   │   ├── bin_raw.h
│   │   │   ├── came.c
│   │   │   ├── came.h
│   │   │   ├── came_atomo.c
│   │   │   ├── came_atomo.h
│   │   │   ├── came_twee.c
│   │   │   ├── came_twee.h
│   │   │   ├── chamberlain_code.c
│   │   │   ├── chamberlain_code.h
│   │   │   ├── clemsa.c
│   │   │   ├── clemsa.h
│   │   │   ├── dickert_mahs.c
│   │   │   ├── dickert_mahs.h
│   │   │   ├── doitrand.c
│   │   │   ├── doitrand.h
│   │   │   ├── dooya.c
│   │   │   ├── dooya.h
│   │   │   ├── faac_slh.c
│   │   │   ├── faac_slh.h
│   │   │   ├── feron.c
│   │   │   ├── feron.h
│   │   │   ├── gangqi.c
│   │   │   ├── gangqi.h
│   │   │   ├── gate_tx.c
│   │   │   ├── gate_tx.h
│   │   │   ├── hay21.c
│   │   │   ├── hay21.h
│   │   │   ├── hollarm.c
│   │   │   ├── hollarm.h
│   │   │   ├── holtek.c
│   │   │   ├── holtek.h
│   │   │   ├── holtek_ht12x.c
│   │   │   ├── holtek_ht12x.h
│   │   │   ├── honeywell_wdb.c
│   │   │   ├── honeywell_wdb.h
│   │   │   ├── hormann.c
│   │   │   ├── hormann.h
│   │   │   ├── ido.c
│   │   │   ├── ido.h
│   │   │   ├── intertechno_v3.c
│   │   │   ├── intertechno_v3.h
│   │   │   ├── keeloq.c
│   │   │   ├── keeloq.h
│   │   │   ├── keeloq_common.c
│   │   │   ├── keeloq_common.h
│   │   │   ├── kia.c
│   │   │   ├── kia.h
│   │   │   ├── kinggates_stylo_4k.c
│   │   │   ├── kinggates_stylo_4k.h
│   │   │   ├── legrand.c
│   │   │   ├── legrand.h
│   │   │   ├── linear.c
│   │   │   ├── linear.h
│   │   │   ├── linear_delta3.c
│   │   │   ├── linear_delta3.h
│   │   │   ├── magellan.c
│   │   │   ├── magellan.h
│   │   │   ├── marantec.c
│   │   │   ├── marantec.h
│   │   │   ├── marantec24.c
│   │   │   ├── marantec24.h
│   │   │   ├── mastercode.c
│   │   │   ├── mastercode.h
│   │   │   ├── megacode.c
│   │   │   ├── megacode.h
│   │   │   ├── nero_radio.c
│   │   │   ├── nero_radio.h
│   │   │   ├── nero_sketch.c
│   │   │   ├── nero_sketch.h
│   │   │   ├── nice_flo.c
│   │   │   ├── nice_flo.h
│   │   │   ├── nice_flor_s.c
│   │   │   ├── nice_flor_s.h
│   │   │   ├── phoenix_v2.c
│   │   │   ├── phoenix_v2.h
│   │   │   ├── power_smart.c
│   │   │   ├── power_smart.h
│   │   │   ├── princeton.c
│   │   │   ├── princeton.h
│   │   │   ├── protocol_items.c
│   │   │   ├── protocol_items.h
│   │   │   ├── public_api.h
│   │   │   ├── raw.c
│   │   │   ├── raw.h
│   │   │   ├── revers_rb2.c
│   │   │   ├── revers_rb2.h
│   │   │   ├── roger.c
│   │   │   ├── roger.h
│   │   │   ├── scher_khan.c
│   │   │   ├── scher_khan.h
│   │   │   ├── secplus_v1.c
│   │   │   ├── secplus_v1.h
│   │   │   ├── secplus_v2.c
│   │   │   ├── secplus_v2.h
│   │   │   ├── smc5326.c
│   │   │   ├── smc5326.h
│   │   │   ├── somfy_keytis.c
│   │   │   ├── somfy_keytis.h
│   │   │   ├── somfy_telis.c
│   │   │   ├── somfy_telis.h
│   │   │   ├── star_line.c
│   │   │   └── star_line.h
│   │   ├── receiver.c
│   │   ├── receiver.h
│   │   ├── registry.c
│   │   ├── registry.h
│   │   ├── subghz_file_encoder_worker.c
│   │   ├── subghz_file_encoder_worker.h
│   │   ├── subghz_keystore.c
│   │   ├── subghz_keystore.h
│   │   ├── subghz_protocol_registry.h
│   │   ├── subghz_setting.c
│   │   ├── subghz_setting.h
│   │   ├── subghz_tx_rx_worker.c
│   │   ├── subghz_tx_rx_worker.h
│   │   ├── subghz_worker.c
│   │   ├── subghz_worker.h
│   │   ├── transmitter.c
│   │   ├── transmitter.h
│   │   └── types.h
│   ├── toolbox/
│   │   ├── .gitignore
│   │   ├── SConscript
│   │   ├── api_lock.h
│   │   ├── args.c
│   │   ├── args.h
│   │   ├── bit_buffer.c
│   │   ├── bit_buffer.h
│   │   ├── buffer_stream.c
│   │   ├── buffer_stream.h
│   │   ├── cli/
│   │   │   ├── cli_ansi.c
│   │   │   ├── cli_ansi.h
│   │   │   ├── cli_command.c
│   │   │   ├── cli_command.h
│   │   │   ├── cli_registry.c
│   │   │   ├── cli_registry.h
│   │   │   ├── cli_registry_i.h
│   │   │   └── shell/
│   │   │       ├── cli_shell.c
│   │   │       ├── cli_shell.h
│   │   │       ├── cli_shell_completions.c
│   │   │       ├── cli_shell_completions.h
│   │   │       ├── cli_shell_i.h
│   │   │       ├── cli_shell_line.c
│   │   │       └── cli_shell_line.h
│   │   ├── compress.c
│   │   ├── compress.h
│   │   ├── crc32_calc.c
│   │   ├── crc32_calc.h
│   │   ├── dir_walk.c
│   │   ├── dir_walk.h
│   │   ├── float_tools.c
│   │   ├── float_tools.h
│   │   ├── hex.c
│   │   ├── hex.h
│   │   ├── keys_dict.c
│   │   ├── keys_dict.h
│   │   ├── level_duration.h
│   │   ├── m_cstr_dup.h
│   │   ├── manchester_decoder.c
│   │   ├── manchester_decoder.h
│   │   ├── manchester_encoder.c
│   │   ├── manchester_encoder.h
│   │   ├── md5_calc.c
│   │   ├── md5_calc.h
│   │   ├── name_generator.c
│   │   ├── name_generator.h
│   │   ├── path.c
│   │   ├── path.h
│   │   ├── pipe.c
│   │   ├── pipe.h
│   │   ├── pretty_format.c
│   │   ├── pretty_format.h
│   │   ├── profiler.c
│   │   ├── profiler.h
│   │   ├── property.c
│   │   ├── property.h
│   │   ├── protocols/
│   │   │   ├── protocol.h
│   │   │   ├── protocol_dict.c
│   │   │   └── protocol_dict.h
│   │   ├── pulse_joiner.c
│   │   ├── pulse_joiner.h
│   │   ├── pulse_protocols/
│   │   │   ├── pulse_glue.c
│   │   │   └── pulse_glue.h
│   │   ├── saved_struct.c
│   │   ├── saved_struct.h
│   │   ├── settings_helpers/
│   │   │   ├── submenu_based.c
│   │   │   └── submenu_based.h
│   │   ├── simple_array.c
│   │   ├── simple_array.h
│   │   ├── str_buffer.c
│   │   ├── str_buffer.h
│   │   ├── stream/
│   │   │   ├── buffered_file_stream.c
│   │   │   ├── buffered_file_stream.h
│   │   │   ├── file_stream.c
│   │   │   ├── file_stream.h
│   │   │   ├── stream.c
│   │   │   ├── stream.h
│   │   │   ├── stream_cache.c
│   │   │   ├── stream_cache.h
│   │   │   ├── stream_i.h
│   │   │   ├── string_stream.c
│   │   │   └── string_stream.h
│   │   ├── strint.c
│   │   ├── strint.h
│   │   ├── tar/
│   │   │   ├── tar_archive.c
│   │   │   └── tar_archive.h
│   │   ├── value_index.c
│   │   ├── value_index.h
│   │   ├── varint.c
│   │   ├── varint.h
│   │   ├── version.c
│   │   └── version.h
│   ├── u8g2/
│   │   ├── SConscript
│   │   ├── u8g2.h
│   │   ├── u8g2_bitmap.c
│   │   ├── u8g2_box.c
│   │   ├── u8g2_buffer.c
│   │   ├── u8g2_circle.c
│   │   ├── u8g2_d_memory.c
│   │   ├── u8g2_font.c
│   │   ├── u8g2_fonts.c
│   │   ├── u8g2_glue.c
│   │   ├── u8g2_glue.h
│   │   ├── u8g2_hvline.c
│   │   ├── u8g2_intersection.c
│   │   ├── u8g2_line.c
│   │   ├── u8g2_ll_hvline.c
│   │   ├── u8g2_setup.c
│   │   ├── u8x8.h
│   │   ├── u8x8_8x8.c
│   │   ├── u8x8_byte.c
│   │   ├── u8x8_cad.c
│   │   ├── u8x8_display.c
│   │   ├── u8x8_gpio.c
│   │   └── u8x8_setup.c
│   └── update_util/
│       ├── SConscript
│       ├── dfu_file.c
│       ├── dfu_file.h
│       ├── dfu_headers.h
│       ├── int_backup.c
│       ├── int_backup.h
│       ├── resources/
│       │   ├── manifest.c
│       │   └── manifest.h
│       ├── update_manifest.c
│       ├── update_manifest.h
│       ├── update_operation.c
│       └── update_operation.h
├── scripts/
│   ├── ReadMe.md
│   ├── assets.py
│   ├── bin2dfu.py
│   ├── debug/
│   │   ├── 41-flipper.rules
│   │   ├── FreeRTOS/
│   │   │   ├── FreeRTOS.py
│   │   │   ├── FreeRTOSgdb/
│   │   │   │   ├── EventGroup.py
│   │   │   │   ├── GDBCommands.py
│   │   │   │   ├── HandleRegistry.py
│   │   │   │   ├── List.py
│   │   │   │   ├── QueueTools.py
│   │   │   │   ├── Task.py
│   │   │   │   ├── Types.py
│   │   │   │   └── __init__.py
│   │   │   ├── LICENSE
│   │   │   └── README.md
│   │   ├── PyCortexMDebug/
│   │   │   ├── LICENSE
│   │   │   ├── PyCortexMDebug.py
│   │   │   ├── README.md
│   │   │   └── cmdebug/
│   │   │       ├── __init__.py
│   │   │       ├── svd.py
│   │   │       └── svd_gdb.py
│   │   ├── README.md
│   │   ├── STM32WB55_CM4.svd
│   │   ├── flipperapps.py
│   │   ├── flipperversion.py
│   │   ├── fw.jflash
│   │   ├── gdbinit
│   │   └── stm32wbx.cfg
│   ├── fastfap.py
│   ├── fbt/
│   │   ├── __init__.py
│   │   ├── appmanifest.py
│   │   ├── elfmanifest.py
│   │   ├── fapassets.py
│   │   ├── sdk/
│   │   │   ├── __init__.py
│   │   │   ├── cache.py
│   │   │   ├── collector.py
│   │   │   └── hashes.py
│   │   ├── util.py
│   │   └── version.py
│   ├── fbt_tools/
│   │   ├── blackmagic.py
│   │   ├── ccache.py
│   │   ├── compilation_db.py
│   │   ├── crosscc.py
│   │   ├── doxygen.py
│   │   ├── fbt_apps.py
│   │   ├── fbt_assets.py
│   │   ├── fbt_debugopts.py
│   │   ├── fbt_dist.py
│   │   ├── fbt_envhooks.py
│   │   ├── fbt_extapps.py
│   │   ├── fbt_help.py
│   │   ├── fbt_hwtarget.py
│   │   ├── fbt_resources.py
│   │   ├── fbt_sdk.py
│   │   ├── fbt_tweaks.py
│   │   ├── fbt_version.py
│   │   ├── fwbin.py
│   │   ├── gdb.py
│   │   ├── jflash.py
│   │   ├── objdump.py
│   │   ├── openocd.py
│   │   ├── pvsstudio.py
│   │   ├── python3.py
│   │   ├── sconsmodular.py
│   │   ├── sconsrecursiveglob.py
│   │   └── strip.py
│   ├── flash.py
│   ├── flipper/
│   │   ├── __init__.py
│   │   ├── app.py
│   │   ├── assets/
│   │   │   ├── __init__.py
│   │   │   ├── copro.py
│   │   │   ├── coprobin.py
│   │   │   ├── dolphin.py
│   │   │   ├── heatshrink_stream.py
│   │   │   ├── icon.py
│   │   │   ├── manifest.py
│   │   │   ├── obdata.py
│   │   │   ├── tarball.py
│   │   │   └── templates/
│   │   │       ├── dolphin.c.tmpl
│   │   │       └── dolphin.h.tmpl
│   │   ├── cube.py
│   │   ├── storage.py
│   │   └── utils/
│   │       ├── __init__.py
│   │       ├── cdc.py
│   │       ├── fff.py
│   │       ├── fstree.py
│   │       ├── openocd.py
│   │       ├── programmer.py
│   │       ├── programmer_openocd.py
│   │       ├── register.py
│   │       ├── stm32wb55.py
│   │       └── templite.py
│   ├── fwflash.py
│   ├── fwsize.py
│   ├── get_env.py
│   ├── guruguru.py
│   ├── hs.py
│   ├── imglint.py
│   ├── infrared.py
│   ├── lint.py
│   ├── map_analyse_upload.py
│   ├── merge_report_qa.py
│   ├── ob.data
│   ├── ob.py
│   ├── ob_custradio.data
│   ├── otp.py
│   ├── power.py
│   ├── runfap.py
│   ├── sconsdist.py
│   ├── selfupdate.py
│   ├── send_firebase_notification.py
│   ├── serial_cli.py
│   ├── serial_cli_perf.py
│   ├── slideshow.py
│   ├── storage.py
│   ├── testops.py
│   ├── toolchain/
│   │   ├── fbtenv.cmd
│   │   ├── fbtenv.sh
│   │   └── windows-toolchain-download.ps1
│   ├── ufbt/
│   │   ├── SConstruct
│   │   ├── commandline.scons
│   │   ├── project_template/
│   │   │   ├── .gitignore
│   │   │   └── app_template/
│   │   │       ├── ${FBT_APPID}.c
│   │   │       ├── .github/
│   │   │       │   └── workflows/
│   │   │       │       └── build.yml
│   │   │       └── application.fam
│   │   ├── site_init.py
│   │   └── site_tools/
│   │       ├── ufbt_help.py
│   │       └── ufbt_state.py
│   ├── update.py
│   ├── version.py
│   └── wifi_board.py
├── site_scons/
│   ├── cc.scons
│   ├── commandline.scons
│   ├── environ.scons
│   ├── extapps.scons
│   ├── fbt_extra/
│   │   └── util.py
│   ├── firmwareopts.scons
│   └── site_init.py
├── targets/
│   ├── ReadMe.md
│   ├── SConscript
│   ├── f18/
│   │   ├── api_symbols.csv
│   │   ├── furi_hal/
│   │   │   ├── furi_hal.c
│   │   │   ├── furi_hal_power_config.c
│   │   │   ├── furi_hal_resources.c
│   │   │   ├── furi_hal_resources.h
│   │   │   ├── furi_hal_spi_config.c
│   │   │   ├── furi_hal_spi_config.h
│   │   │   ├── furi_hal_target_hw.h
│   │   │   └── furi_hal_version_device.c
│   │   └── target.json
│   ├── f7/
│   │   ├── api_symbols.csv
│   │   ├── application_ext.ld
│   │   ├── ble_glue/
│   │   │   ├── app_common.h
│   │   │   ├── app_conf.h
│   │   │   ├── app_debug.c
│   │   │   ├── app_debug.h
│   │   │   ├── ble_app.c
│   │   │   ├── ble_app.h
│   │   │   ├── ble_conf.h
│   │   │   ├── ble_const.h
│   │   │   ├── ble_dbg_conf.h
│   │   │   ├── ble_event_thread.c
│   │   │   ├── ble_event_thread.h
│   │   │   ├── ble_glue.c
│   │   │   ├── ble_glue.h
│   │   │   ├── ble_tl_hooks.c
│   │   │   ├── compiler.h
│   │   │   ├── extra_beacon.c
│   │   │   ├── extra_beacon.h
│   │   │   ├── furi_ble/
│   │   │   │   ├── event_dispatcher.c
│   │   │   │   ├── event_dispatcher.h
│   │   │   │   ├── gatt.c
│   │   │   │   ├── gatt.h
│   │   │   │   └── profile_interface.h
│   │   │   ├── gap.c
│   │   │   ├── gap.h
│   │   │   ├── hsem_map.h
│   │   │   ├── hw_ipcc.c
│   │   │   ├── osal.h
│   │   │   ├── profiles/
│   │   │   │   ├── serial_profile.c
│   │   │   │   └── serial_profile.h
│   │   │   ├── services/
│   │   │   │   ├── battery_service.c
│   │   │   │   ├── battery_service.h
│   │   │   │   ├── dev_info_service.c
│   │   │   │   ├── dev_info_service.h
│   │   │   │   ├── dev_info_service_uuid.inc
│   │   │   │   ├── serial_service.c
│   │   │   │   ├── serial_service.h
│   │   │   │   └── serial_service_uuid.inc
│   │   │   └── tl_dbg_conf.h
│   │   ├── fatfs/
│   │   │   ├── fatfs.c
│   │   │   ├── fatfs.h
│   │   │   ├── ffconf.h
│   │   │   ├── sector_cache.c
│   │   │   ├── sector_cache.h
│   │   │   ├── user_diskio.c
│   │   │   └── user_diskio.h
│   │   ├── furi_hal/
│   │   │   ├── furi_hal.c
│   │   │   ├── furi_hal_adc.c
│   │   │   ├── furi_hal_bt.c
│   │   │   ├── furi_hal_bus.c
│   │   │   ├── furi_hal_bus.h
│   │   │   ├── furi_hal_clock.c
│   │   │   ├── furi_hal_clock.h
│   │   │   ├── furi_hal_cortex.c
│   │   │   ├── furi_hal_crypto.c
│   │   │   ├── furi_hal_debug.c
│   │   │   ├── furi_hal_dma.c
│   │   │   ├── furi_hal_dma.h
│   │   │   ├── furi_hal_flash.c
│   │   │   ├── furi_hal_flash.h
│   │   │   ├── furi_hal_gpio.c
│   │   │   ├── furi_hal_gpio.h
│   │   │   ├── furi_hal_i2c.c
│   │   │   ├── furi_hal_i2c_config.c
│   │   │   ├── furi_hal_i2c_config.h
│   │   │   ├── furi_hal_i2c_types.h
│   │   │   ├── furi_hal_ibutton.c
│   │   │   ├── furi_hal_ibutton.h
│   │   │   ├── furi_hal_idle_timer.h
│   │   │   ├── furi_hal_info.c
│   │   │   ├── furi_hal_infrared.c
│   │   │   ├── furi_hal_interrupt.c
│   │   │   ├── furi_hal_interrupt.h
│   │   │   ├── furi_hal_light.c
│   │   │   ├── furi_hal_memory.c
│   │   │   ├── furi_hal_mpu.c
│   │   │   ├── furi_hal_nfc.c
│   │   │   ├── furi_hal_nfc_event.c
│   │   │   ├── furi_hal_nfc_felica.c
│   │   │   ├── furi_hal_nfc_i.h
│   │   │   ├── furi_hal_nfc_irq.c
│   │   │   ├── furi_hal_nfc_iso14443a.c
│   │   │   ├── furi_hal_nfc_iso14443b.c
│   │   │   ├── furi_hal_nfc_iso15693.c
│   │   │   ├── furi_hal_nfc_tech_i.h
│   │   │   ├── furi_hal_nfc_timer.c
│   │   │   ├── furi_hal_os.c
│   │   │   ├── furi_hal_os.h
│   │   │   ├── furi_hal_power.c
│   │   │   ├── furi_hal_power_config.c
│   │   │   ├── furi_hal_pwm.c
│   │   │   ├── furi_hal_pwm.h
│   │   │   ├── furi_hal_random.c
│   │   │   ├── furi_hal_region.c
│   │   │   ├── furi_hal_resources.c
│   │   │   ├── furi_hal_resources.h
│   │   │   ├── furi_hal_rfid.c
│   │   │   ├── furi_hal_rfid.h
│   │   │   ├── furi_hal_rtc.c
│   │   │   ├── furi_hal_rtc.h
│   │   │   ├── furi_hal_sd.c
│   │   │   ├── furi_hal_serial.c
│   │   │   ├── furi_hal_serial.h
│   │   │   ├── furi_hal_serial_control.c
│   │   │   ├── furi_hal_serial_control.h
│   │   │   ├── furi_hal_serial_types.h
│   │   │   ├── furi_hal_serial_types_i.h
│   │   │   ├── furi_hal_speaker.c
│   │   │   ├── furi_hal_spi.c
│   │   │   ├── furi_hal_spi_config.c
│   │   │   ├── furi_hal_spi_config.h
│   │   │   ├── furi_hal_spi_types.h
│   │   │   ├── furi_hal_subghz.c
│   │   │   ├── furi_hal_subghz.h
│   │   │   ├── furi_hal_target_hw.h
│   │   │   ├── furi_hal_usb.c
│   │   │   ├── furi_hal_usb_ccid.c
│   │   │   ├── furi_hal_usb_cdc.c
│   │   │   ├── furi_hal_usb_cdc.h
│   │   │   ├── furi_hal_usb_hid.c
│   │   │   ├── furi_hal_usb_i.h
│   │   │   ├── furi_hal_usb_u2f.c
│   │   │   ├── furi_hal_version.c
│   │   │   ├── furi_hal_version_device.c
│   │   │   └── furi_hal_vibro.c
│   │   ├── inc/
│   │   │   ├── FreeRTOSConfig.h
│   │   │   ├── alt_boot.h
│   │   │   ├── furi_config.h
│   │   │   ├── stm32.h
│   │   │   ├── stm32_assert.h
│   │   │   ├── stm32wb55_linker.h
│   │   │   └── stm32wb55_startup.h
│   │   ├── platform_specific/
│   │   │   ├── cxx_virtual_stub.c
│   │   │   ├── cxx_virtual_stub.h
│   │   │   ├── intrinsic_export.h
│   │   │   └── math_wrapper.h
│   │   ├── src/
│   │   │   ├── dfu.c
│   │   │   ├── main.c
│   │   │   ├── recovery.c
│   │   │   ├── stm32wb55_startup.c
│   │   │   └── update.c
│   │   ├── stm32wb55xx_flash.ld
│   │   ├── stm32wb55xx_ram_fw.ld
│   │   └── target.json
│   └── furi_hal_include/
│       ├── furi_hal.h
│       ├── furi_hal_adc.h
│       ├── furi_hal_bt.h
│       ├── furi_hal_cortex.h
│       ├── furi_hal_crypto.h
│       ├── furi_hal_debug.h
│       ├── furi_hal_i2c.h
│       ├── furi_hal_info.h
│       ├── furi_hal_infrared.h
│       ├── furi_hal_light.h
│       ├── furi_hal_memory.h
│       ├── furi_hal_mpu.h
│       ├── furi_hal_nfc.h
│       ├── furi_hal_power.h
│       ├── furi_hal_random.h
│       ├── furi_hal_region.h
│       ├── furi_hal_sd.h
│       ├── furi_hal_speaker.h
│       ├── furi_hal_spi.h
│       ├── furi_hal_usb.h
│       ├── furi_hal_usb_ccid.h
│       ├── furi_hal_usb_hid.h
│       ├── furi_hal_usb_hid_u2f.h
│       ├── furi_hal_version.h
│       └── furi_hal_vibro.h
└── tsconfig.json
Download .txt
Showing preview only (1,396K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (13637 symbols across 1680 files)

FILE: applications/debug/accessor/accessor.cpp
  function accessor_app (line 4) | int32_t accessor_app(void* p) {

FILE: applications/debug/accessor/accessor_app.cpp
  function AccessorAppViewManager (line 54) | AccessorAppViewManager* AccessorApp::get_view_manager() {
  function WIEGAND (line 142) | WIEGAND* AccessorApp::get_wiegand() {
  function OneWireHost (line 146) | OneWireHost* AccessorApp::get_one_wire() {

FILE: applications/debug/accessor/accessor_app.h
  type class (line 19) | enum class

FILE: applications/debug/accessor/accessor_event.h
  function class (line 4) | class AccessorEvent {

FILE: applications/debug/accessor/accessor_view_manager.cpp
  function Submenu (line 53) | Submenu* AccessorAppViewManager::get_submenu() {
  function Popup (line 57) | Popup* AccessorAppViewManager::get_popup() {

FILE: applications/debug/accessor/accessor_view_manager.h
  function class (line 8) | class AccessorAppViewManager {

FILE: applications/debug/accessor/callback_connector.h
  function namespace (line 6) | namespace cbc {

FILE: applications/debug/accessor/helpers/wiegand.cpp
  function input_isr_d0 (line 40) | static void input_isr_d0(void* _ctx) {
  function input_isr_d1 (line 45) | static void input_isr_d1(void* _ctx) {
  function translateEnterEscapeKeyPress (line 122) | char translateEnterEscapeKeyPress(char originalKeyPress) {

FILE: applications/debug/accessor/helpers/wiegand.h
  function class (line 3) | class WIEGAND {

FILE: applications/debug/accessor/scene/accessor_scene_generic.h
  function class (line 6) | class AccessorScene {

FILE: applications/debug/accessor/scene/accessor_scene_start.h
  function class (line 4) | class AccessorSceneStart : public AccessorScene {

FILE: applications/debug/battery_test_app/battery_test_app.c
  function battery_test_dialog_callback (line 5) | void battery_test_dialog_callback(DialogExResult result, void* context) {
  function battery_test_exit_confirm_view (line 15) | uint32_t battery_test_exit_confirm_view(void* context) {
  function battery_test_battery_info_update_model (line 20) | static void battery_test_battery_info_update_model(void* context) {
  function BatteryTestApp (line 35) | BatteryTestApp* battery_test_alloc(void) {
  function battery_test_free (line 74) | void battery_test_free(BatteryTestApp* app) {
  function battery_test_app (line 91) | int32_t battery_test_app(void* p) {

FILE: applications/debug/battery_test_app/battery_test_app.h
  type BatteryTestApp (line 12) | typedef struct {
  type BatteryTestAppView (line 22) | typedef enum {

FILE: applications/debug/battery_test_app/views/battery_info.c
  type BatteryInfo (line 9) | struct BatteryInfo {
  function draw_stat (line 13) | static void draw_stat(Canvas* canvas, int x, int y, const Icon* icon, ch...
  function draw_battery (line 22) | static void draw_battery(Canvas* canvas, BatteryInfoModel* data, int x, ...
  function battery_info_draw_callback (line 90) | static void battery_info_draw_callback(Canvas* canvas, void* context) {
  function BatteryInfo (line 119) | BatteryInfo* battery_info_alloc(void) {
  function battery_info_free (line 129) | void battery_info_free(BatteryInfo* battery_info) {
  function View (line 135) | View* battery_info_get_view(BatteryInfo* battery_info) {
  function battery_info_set_data (line 140) | void battery_info_set_data(BatteryInfo* battery_info, BatteryInfoModel* ...

FILE: applications/debug/battery_test_app/views/battery_info.h
  type BatteryInfo (line 5) | typedef struct BatteryInfo BatteryInfo;
  type BatteryInfoModel (line 7) | typedef struct {

FILE: applications/debug/blink_test/blink_test.c
  type BlinkEventType (line 9) | typedef enum {
  type BlinkEvent (line 14) | typedef struct {
  function blink_test_update (line 55) | static void blink_test_update(void* ctx) {
  function blink_test_draw_callback (line 63) | static void blink_test_draw_callback(Canvas* canvas, void* ctx) {
  function blink_test_input_callback (line 70) | static void blink_test_input_callback(InputEvent* input_event, void* ctx) {
  function blink_test_app (line 78) | int32_t blink_test_app(void* p) {

FILE: applications/debug/bt_debug_app/bt_debug_app.c
  type BtDebugSubmenuIndex (line 6) | enum BtDebugSubmenuIndex {
  function bt_debug_submenu_callback (line 11) | void bt_debug_submenu_callback(void* context, uint32_t index) {
  function bt_debug_exit (line 21) | uint32_t bt_debug_exit(void* context) {
  function bt_debug_start_view (line 26) | uint32_t bt_debug_start_view(void* context) {
  function BtDebugApp (line 31) | BtDebugApp* bt_debug_app_alloc(void) {
  function bt_debug_app_free (line 74) | void bt_debug_app_free(BtDebugApp* app) {
  function bt_debug_app (line 94) | int32_t bt_debug_app(void* p) {

FILE: applications/debug/bt_debug_app/bt_debug_app.h
  type BtDebugApp (line 14) | typedef struct {
  type BtDebugAppView (line 22) | typedef enum {

FILE: applications/debug/bt_debug_app/views/bt_carrier_test.c
  type BtCarrierTest (line 6) | struct BtCarrierTest {
  function bt_carrier_test_start (line 34) | static void bt_carrier_test_start(BtCarrierTest* bt_carrier_test) {
  function bt_carrier_test_switch_channel (line 47) | static void bt_carrier_test_switch_channel(BtCarrierTest* bt_carrier_tes...
  function bt_carrier_test_stop (line 67) | static void bt_carrier_test_stop(BtCarrierTest* bt_carrier_test) {
  function bt_carrier_test_param_changed (line 80) | static uint32_t bt_carrier_test_param_changed(BtTestParam* param, BtTest...
  function bt_carrier_test_mode_changed (line 87) | static void bt_carrier_test_mode_changed(BtTestParam* param) {
  function bt_carrier_test_channel_changed (line 93) | static void bt_carrier_test_channel_changed(BtTestParam* param) {
  function bt_carrier_test_param_channel (line 99) | static void bt_carrier_test_param_channel(BtTestParam* param) {
  function bt_carrier_test_change_state_callback (line 105) | static void bt_carrier_test_change_state_callback(BtTestState state, voi...
  function bt_carrier_test_exit_callback (line 116) | static void bt_carrier_test_exit_callback(void* context) {
  function bt_test_carrier_timer_callback (line 122) | static void bt_test_carrier_timer_callback(void* context) {
  function BtCarrierTest (line 132) | BtCarrierTest* bt_carrier_test_alloc(void) {
  function bt_carrier_test_free (line 178) | void bt_carrier_test_free(BtCarrierTest* bt_carrier_test) {
  function View (line 185) | View* bt_carrier_test_get_view(BtCarrierTest* bt_carrier_test) {

FILE: applications/debug/bt_debug_app/views/bt_carrier_test.h
  type BtCarrierTest (line 4) | typedef struct BtCarrierTest BtCarrierTest;

FILE: applications/debug/bt_debug_app/views/bt_packet_test.c
  type BtPacketTest (line 6) | struct BtPacketTest {
  function bt_packet_test_start (line 30) | static void bt_packet_test_start(BtPacketTest* bt_packet_test) {
  function bt_packet_test_stop (line 40) | static void bt_packet_test_stop(BtPacketTest* bt_packet_test) {
  function bt_packet_test_param_changed (line 51) | static uint32_t bt_packet_test_param_changed(BtTestParam* param, BtTestP...
  function bt_packet_test_mode_changed (line 58) | static void bt_packet_test_mode_changed(BtTestParam* param) {
  function bt_packet_test_channel_changed (line 64) | static void bt_packet_test_channel_changed(BtTestParam* param) {
  function bt_packet_test_param_channel (line 70) | static void bt_packet_test_param_channel(BtTestParam* param) {
  function bt_packet_test_change_state_callback (line 76) | static void bt_packet_test_change_state_callback(BtTestState state, void...
  function bt_packet_test_exit_callback (line 86) | static void bt_packet_test_exit_callback(void* context) {
  function bt_test_packet_timer_callback (line 92) | static void bt_test_packet_timer_callback(void* context) {
  function BtPacketTest (line 100) | BtPacketTest* bt_packet_test_alloc(void) {
  function bt_packet_test_free (line 145) | void bt_packet_test_free(BtPacketTest* bt_packet_test) {
  function View (line 152) | View* bt_packet_test_get_view(BtPacketTest* bt_packet_test) {

FILE: applications/debug/bt_debug_app/views/bt_packet_test.h
  type BtPacketTest (line 4) | typedef struct BtPacketTest BtPacketTest;

FILE: applications/debug/bt_debug_app/views/bt_test.c
  type BtTestParam (line 12) | struct BtTestParam {
  type BtTest (line 23) | struct BtTest {
  type BtTestModel (line 30) | typedef struct {
  function bt_test_draw_callback (line 51) | static void bt_test_draw_callback(Canvas* canvas, void* _model) {
  function bt_test_input_callback (line 119) | static bool bt_test_input_callback(InputEvent* event, void* context) {
  function bt_test_process_up (line 158) | void bt_test_process_up(BtTest* bt_test) {
  function bt_test_process_down (line 180) | void bt_test_process_down(BtTest* bt_test) {
  function BtTestParam (line 201) | BtTestParam* bt_test_get_selected_param(BtTestModel* model) {
  function bt_test_process_left (line 220) | void bt_test_process_left(BtTest* bt_test) {
  function bt_test_process_right (line 244) | void bt_test_process_right(BtTest* bt_test) {
  function bt_test_process_ok (line 268) | void bt_test_process_ok(BtTest* bt_test) {
  function bt_test_process_back (line 292) | void bt_test_process_back(BtTest* bt_test) {
  function BtTest (line 308) | BtTest* bt_test_alloc(void) {
  function bt_test_free (line 334) | void bt_test_free(BtTest* bt_test) {
  function View (line 353) | View* bt_test_get_view(BtTest* bt_test) {
  function BtTestParam (line 358) | BtTestParam* bt_test_param_add(
  function bt_test_set_rssi (line 385) | void bt_test_set_rssi(BtTest* bt_test, float rssi) {
  function bt_test_set_packets_tx (line 390) | void bt_test_set_packets_tx(BtTest* bt_test, uint32_t packets_num) {
  function bt_test_set_packets_rx (line 396) | void bt_test_set_packets_rx(BtTest* bt_test, uint32_t packets_num) {
  function bt_test_set_change_state_callback (line 402) | void bt_test_set_change_state_callback(BtTest* bt_test, BtTestChangeStat...
  function bt_test_set_back_callback (line 408) | void bt_test_set_back_callback(BtTest* bt_test, BtTestBackCallback callb...
  function bt_test_set_context (line 414) | void bt_test_set_context(BtTest* bt_test, void* context) {
  function bt_test_set_current_value_index (line 419) | void bt_test_set_current_value_index(BtTestParam* param, uint8_t current...
  function bt_test_set_current_value_text (line 423) | void bt_test_set_current_value_text(BtTestParam* param, const char* curr...
  function bt_test_get_current_value_index (line 427) | uint8_t bt_test_get_current_value_index(BtTestParam* param) {

FILE: applications/debug/bt_debug_app/views/bt_test.h
  type BtTestState (line 4) | typedef enum {
  type BtTest (line 9) | typedef struct BtTest BtTest;
  type BtTestParam (line 12) | typedef struct BtTestParam BtTestParam;

FILE: applications/debug/bt_debug_app/views/bt_test_types.h
  type BtTestMode (line 3) | typedef enum {
  type BtTestChannel (line 9) | typedef enum {
  type BtTestPower (line 15) | typedef enum {
  type BtTestDataRate (line 22) | typedef enum {
  type BtTestParamValue (line 27) | typedef struct {

FILE: applications/debug/ccid_test/ccid_test_app.c
  type EventType (line 17) | typedef enum {
  type CcidTestApp (line 21) | typedef struct {
  type CcidTestAppEvent (line 29) | typedef struct {
  type SubmenuIndex (line 36) | typedef enum {
  function ccid_test_app_render_callback (line 42) | static void ccid_test_app_render_callback(Canvas* canvas, void* ctx) {
  function ccid_test_app_input_callback (line 53) | static void ccid_test_app_input_callback(InputEvent* input_event, void* ...
  function ccid_test_exit (line 62) | uint32_t ccid_test_exit(void* context) {
  function CcidTestApp (line 67) | CcidTestApp* ccid_test_app_alloc(void) {
  function ccid_test_app_free (line 94) | void ccid_test_app_free(CcidTestApp* app) {
  function ccid_test_app (line 114) | int32_t ccid_test_app(void* p) {

FILE: applications/debug/ccid_test/ccid_test_app_commands.c
  function handle_instruction_01 (line 7) | void handle_instruction_01(ISO7816_Response_APDU* response_apdu) {
  function handle_instruction_02 (line 15) | void handle_instruction_02(
  function handle_instruction_03 (line 38) | void handle_instruction_03(
  function handle_instruction_04 (line 56) | void handle_instruction_04(
  function iso7816_answer_to_reset (line 78) | void iso7816_answer_to_reset(Iso7816Atr* atr) {
  function iso7816_process_command (line 84) | void iso7816_process_command(

FILE: applications/debug/ccid_test/client/ccid_client.py
  function test_apdu (line 6) | def test_apdu(connection, test_name, apdu, expected_sw1, expected_sw2, e...
  function main (line 41) | def main():

FILE: applications/debug/ccid_test/iso7816/iso7816_atr.h
  type Iso7816Atr (line 3) | typedef struct {

FILE: applications/debug/ccid_test/iso7816/iso7816_handler.c
  function iso7816_icc_power_on_callback (line 20) | void iso7816_icc_power_on_callback(uint8_t* atr_data, uint32_t* atr_data...
  function iso7816_xfr_datablock_callback (line 39) | void iso7816_xfr_datablock_callback(
  function Iso7816Handler (line 68) | Iso7816Handler* iso7816_handler_alloc() {
  function iso7816_handler_set_usb_ccid_callbacks (line 81) | void iso7816_handler_set_usb_ccid_callbacks() {
  function iso7816_handler_reset_usb_ccid_callbacks (line 85) | void iso7816_handler_reset_usb_ccid_callbacks() {
  function iso7816_handler_free (line 89) | void iso7816_handler_free(Iso7816Handler* handler) {

FILE: applications/debug/ccid_test/iso7816/iso7816_handler.h
  type Iso7816Handler (line 7) | typedef struct {

FILE: applications/debug/ccid_test/iso7816/iso7816_response.c
  function iso7816_set_response (line 5) | void iso7816_set_response(ISO7816_Response_APDU* responseAPDU, uint16_t ...

FILE: applications/debug/ccid_test/iso7816/iso7816_t0_apdu.c
  function iso7816_read_command_apdu (line 8) | uint8_t iso7816_read_command_apdu(
  function iso7816_write_response_apdu (line 61) | void iso7816_write_response_apdu(

FILE: applications/debug/ccid_test/iso7816/iso7816_t0_apdu.h
  type FURI_PACKED (line 11) | typedef struct {
  type FURI_PACKED (line 27) | typedef struct {

FILE: applications/debug/crash_test/crash_test.c
  type CrashTest (line 10) | typedef struct {
  type CrashTestView (line 16) | typedef enum {
  type CrashTestSubmenu (line 20) | typedef enum {
  function crash_test_corrupt_heap_underflow (line 31) | static void crash_test_corrupt_heap_underflow(void) {
  function crash_test_corrupt_heap_overflow (line 47) | static void crash_test_corrupt_heap_overflow(void) {
  function crash_test_submenu_callback (line 70) | static void crash_test_submenu_callback(void* context, uint32_t index) {
  function crash_test_exit_callback (line 104) | static uint32_t crash_test_exit_callback(void* context) {
  function CrashTest (line 109) | CrashTest* crash_test_alloc(void) {
  function crash_test_free (line 160) | void crash_test_free(CrashTest* instance) {
  function crash_test_run (line 170) | int32_t crash_test_run(CrashTest* instance) {
  function crash_test_app (line 176) | int32_t crash_test_app(void* p) {

FILE: applications/debug/direct_draw/direct_draw.c
  type DirectDraw (line 7) | typedef struct {
  function gui_input_events_callback (line 16) | static void gui_input_events_callback(const void* value, void* ctx) {
  function DirectDraw (line 28) | static DirectDraw* direct_draw_alloc(void) {
  function direct_draw_free (line 41) | static void direct_draw_free(DirectDraw* instance) {
  function direct_draw_block (line 51) | static void direct_draw_block(Canvas* canvas, uint32_t size, uint32_t co...
  function direct_draw_run (line 69) | static void direct_draw_run(DirectDraw* instance) {
  function direct_draw_app (line 104) | int32_t direct_draw_app(void* p) {

FILE: applications/debug/display_test/display_test.c
  type DisplayTest (line 17) | typedef struct {
  type DisplayTestView (line 29) | typedef enum {
  function display_test_submenu_callback (line 65) | static void display_test_submenu_callback(void* context, uint32_t index) {
  function display_test_previous_callback (line 70) | static uint32_t display_test_previous_callback(void* context) {
  function display_test_exit_callback (line 75) | static uint32_t display_test_exit_callback(void* context) {
  function display_test_reload_config (line 80) | static void display_test_reload_config(DisplayTest* instance) {
  function display_config_set_bias (line 94) | static void display_config_set_bias(VariableItem* item) {
  function display_config_set_regulation_ratio (line 102) | static void display_config_set_regulation_ratio(VariableItem* item) {
  function display_config_set_contrast (line 110) | static void display_config_set_contrast(VariableItem* item) {
  function DisplayTest (line 122) | DisplayTest* display_test_alloc(void) {
  function display_test_free (line 194) | void display_test_free(DisplayTest* instance) {
  function display_test_run (line 210) | int32_t display_test_run(DisplayTest* instance) {
  function display_test_app (line 218) | int32_t display_test_app(void* p) {

FILE: applications/debug/display_test/view_display_test.c
  type ViewDisplayTestModel (line 3) | typedef struct {
  type ViewDisplayTest (line 10) | struct ViewDisplayTest {
  function view_display_test_draw_callback_intro (line 15) | static void view_display_test_draw_callback_intro(Canvas* canvas, void* ...
  function view_display_test_draw_callback_fill (line 22) | static void view_display_test_draw_callback_fill(Canvas* canvas, void* _...
  function view_display_test_draw_callback_hstripe (line 31) | static void view_display_test_draw_callback_hstripe(Canvas* canvas, void...
  function view_display_test_draw_callback_vstripe (line 42) | static void view_display_test_draw_callback_vstripe(Canvas* canvas, void...
  function view_display_test_draw_callback_check (line 53) | static void view_display_test_draw_callback_check(Canvas* canvas, void* ...
  function view_display_test_draw_callback_move (line 74) | static void view_display_test_draw_callback_move(Canvas* canvas, void* _...
  function view_display_test_draw_callback (line 102) | static void view_display_test_draw_callback(Canvas* canvas, void* _model) {
  function view_display_test_input_callback (line 107) | static bool view_display_test_input_callback(InputEvent* event, void* co...
  function view_display_test_enter (line 141) | static void view_display_test_enter(void* context) {
  function view_display_test_exit (line 146) | static void view_display_test_exit(void* context) {
  function view_display_test_timer_callback (line 151) | static void view_display_test_timer_callback(void* context) {
  function ViewDisplayTest (line 156) | ViewDisplayTest* view_display_test_alloc(void) {
  function view_display_test_free (line 173) | void view_display_test_free(ViewDisplayTest* instance) {
  function View (line 181) | View* view_display_test_get_view(ViewDisplayTest* instance) {

FILE: applications/debug/display_test/view_display_test.h
  type ViewDisplayTest (line 6) | typedef struct ViewDisplayTest ViewDisplayTest;

FILE: applications/debug/event_loop_blink_test/event_loop_blink_test.c
  type EventLoopBlinkTestApp (line 14) | typedef struct {
  function blink_gpio_init (line 42) | static void blink_gpio_init(void) {
  function blink_gpio_deinit (line 52) | static void blink_gpio_deinit(void) {
  function view_port_draw_callback (line 62) | static void view_port_draw_callback(Canvas* canvas, void* context) {
  function view_port_input_callback (line 80) | static void view_port_input_callback(InputEvent* input_event, void* cont...
  function input_queue_callback (line 85) | static void input_queue_callback(FuriEventLoopObject* object, void* cont...
  function blink_timer_callback (line 112) | static void blink_timer_callback(void* context) {
  function event_loop_tick_callback (line 117) | static void event_loop_tick_callback(void* context) {
  function event_loop_blink_test_app (line 122) | int32_t event_loop_blink_test_app(void* arg) {

FILE: applications/debug/expansion_test/expansion_test.c
  type ExpansionTestAppFlag (line 61) | typedef enum {
  type ExpansionTestApp (line 68) | typedef struct {
  function expansion_test_app_serial_rx_callback (line 78) | static void expansion_test_app_serial_rx_callback(
  function ExpansionTestApp (line 93) | static ExpansionTestApp* expansion_test_app_alloc(void) {
  function expansion_test_app_free (line 99) | static void expansion_test_app_free(ExpansionTestApp* instance) {
  function expansion_test_app_start (line 104) | static void expansion_test_app_start(ExpansionTestApp* instance) {
  function expansion_test_app_stop (line 118) | static void expansion_test_app_stop(ExpansionTestApp* instance) {
  function expansion_test_app_is_success_response (line 128) | static inline bool expansion_test_app_is_success_response(const Expansio...
  function expansion_test_app_is_success_rpc_message (line 133) | static inline bool expansion_test_app_is_success_rpc_message(const PB_Ma...
  function expansion_test_app_receive_callback (line 139) | static size_t expansion_test_app_receive_callback(uint8_t* data, size_t ...
  function expansion_test_app_send_callback (line 159) | static size_t
  function expansion_test_app_receive_frame (line 169) | static bool expansion_test_app_receive_frame(ExpansionTestApp* instance,...
  function expansion_test_app_send_status_response (line 174) | static bool
  function expansion_test_app_send_heartbeat (line 184) | static bool expansion_test_app_send_heartbeat(ExpansionTestApp* instance) {
  function expansion_test_app_send_baud_rate_request (line 193) | static bool
  function expansion_test_app_send_control_request (line 203) | static bool expansion_test_app_send_control_request(
  function expansion_test_app_send_data_request (line 214) | static bool expansion_test_app_send_data_request(
  function expansion_test_app_rpc_encode_callback (line 230) | static bool expansion_test_app_rpc_encode_callback(
  function expansion_test_app_send_rpc_request (line 249) | static bool expansion_test_app_send_rpc_request(ExpansionTestApp* instan...
  function expansion_test_app_receive_rpc_request (line 263) | static bool expansion_test_app_receive_rpc_request(ExpansionTestApp* ins...
  function expansion_test_app_send_presence (line 279) | static bool expansion_test_app_send_presence(ExpansionTestApp* instance) {
  function expansion_test_app_wait_ready (line 287) | static bool expansion_test_app_wait_ready(ExpansionTestApp* instance) {
  function expansion_test_app_handshake (line 299) | static bool expansion_test_app_handshake(ExpansionTestApp* instance) {
  function expansion_test_app_enable_otg (line 314) | static bool expansion_test_app_enable_otg(ExpansionTestApp* instance, bo...
  function expansion_test_app_start_rpc (line 330) | static bool expansion_test_app_start_rpc(ExpansionTestApp* instance) {
  function expansion_test_app_rpc_mkdir (line 344) | static bool expansion_test_app_rpc_mkdir(ExpansionTestApp* instance) {
  function expansion_test_app_rpc_write (line 363) | static bool expansion_test_app_rpc_write(ExpansionTestApp* instance) {
  function expansion_test_app_rpc_alert (line 405) | static bool expansion_test_app_rpc_alert(ExpansionTestApp* instance) {
  function expansion_test_app_rpc_enable_otg (line 424) | static bool expansion_test_app_rpc_enable_otg(ExpansionTestApp* instance...
  function expansion_test_app_idle (line 445) | static bool expansion_test_app_idle(ExpansionTestApp* instance, uint32_t...
  function expansion_test_app_stop_rpc (line 457) | static bool expansion_test_app_stop_rpc(ExpansionTestApp* instance) {
  function expansion_test_app (line 471) | int32_t expansion_test_app(void* p) {

FILE: applications/debug/file_browser_test/file_browser_app.c
  function file_browser_app_custom_event_callback (line 10) | static bool file_browser_app_custom_event_callback(void* context, uint32...
  function file_browser_app_back_event_callback (line 16) | static bool file_browser_app_back_event_callback(void* context) {
  function file_browser_app_tick_event_callback (line 22) | static void file_browser_app_tick_event_callback(void* context) {
  function FileBrowserApp (line 28) | FileBrowserApp* file_browser_app_alloc(char* arg) {
  function file_browser_app_free (line 66) | void file_browser_app_free(FileBrowserApp* app) {
  function file_browser_app (line 90) | int32_t file_browser_app(void* p) {

FILE: applications/debug/file_browser_test/file_browser_app_i.h
  type FileBrowserApp (line 15) | typedef struct FileBrowserApp FileBrowserApp;
  type FileBrowserApp (line 17) | struct FileBrowserApp {
  type FileBrowserAppView (line 28) | typedef enum {

FILE: applications/debug/file_browser_test/scenes/file_browser_scene.h
  type FileBrowserScene (line 7) | typedef enum {

FILE: applications/debug/file_browser_test/scenes/file_browser_scene_browser.c
  function file_browser_scene_browser_on_event (line 7) | bool file_browser_scene_browser_on_event(void* context, SceneManagerEven...
  function file_browser_callback (line 20) | static void file_browser_callback(void* context) {
  function file_browser_scene_browser_on_enter (line 26) | void file_browser_scene_browser_on_enter(void* context) {
  function file_browser_scene_browser_on_exit (line 36) | void file_browser_scene_browser_on_exit(void* context) {

FILE: applications/debug/file_browser_test/scenes/file_browser_scene_result.c
  function file_browser_scene_result_ok_callback (line 4) | void file_browser_scene_result_ok_callback(InputType type, void* context) {
  function file_browser_scene_result_on_event (line 10) | bool file_browser_scene_result_on_event(void* context, SceneManagerEvent...
  function file_browser_scene_result_on_enter (line 22) | void file_browser_scene_result_on_enter(void* context) {
  function file_browser_scene_result_on_exit (line 37) | void file_browser_scene_result_on_exit(void* context) {

FILE: applications/debug/file_browser_test/scenes/file_browser_scene_start.c
  function file_browser_scene_start_ok_callback (line 7) | static void
  function file_browser_scene_start_on_event (line 17) | bool file_browser_scene_start_on_event(void* context, SceneManagerEvent ...
  function file_browser_scene_start_on_enter (line 30) | void file_browser_scene_start_on_enter(void* context) {
  function file_browser_scene_start_on_exit (line 42) | void file_browser_scene_start_on_exit(void* context) {

FILE: applications/debug/infrared_test/infrared_test.c
  type InfraredTestApp (line 12) | typedef struct {
  function FuriHalInfraredTxGetDataState (line 17) | static FuriHalInfraredTxGetDataState
  function infrared_test_app (line 38) | int32_t infrared_test_app(void* arg) {

FILE: applications/debug/keypad_test/keypad_test.c
  type KeypadTestState (line 7) | typedef struct {
  function keypad_test_reset_state (line 17) | static void keypad_test_reset_state(KeypadTestState* state) {
  function keypad_test_render_callback (line 25) | static void keypad_test_render_callback(Canvas* canvas, void* ctx) {
  function keypad_test_input_callback (line 59) | static void keypad_test_input_callback(InputEvent* input_event, void* ct...
  function keypad_test_app (line 64) | int32_t keypad_test_app(void* p) {

FILE: applications/debug/lfrfid_debug/lfrfid_debug.c
  function lfrfid_debug_custom_event_callback (line 3) | static bool lfrfid_debug_custom_event_callback(void* context, uint32_t e...
  function lfrfid_debug_back_event_callback (line 9) | static bool lfrfid_debug_back_event_callback(void* context) {
  function LfRfidDebug (line 15) | static LfRfidDebug* lfrfid_debug_alloc(void) {
  function lfrfid_debug_free (line 45) | static void lfrfid_debug_free(LfRfidDebug* app) {
  function lfrfid_debug_app (line 69) | int32_t lfrfid_debug_app(void* p) {

FILE: applications/debug/lfrfid_debug/lfrfid_debug_i.h
  type LfRfidDebug (line 15) | typedef struct LfRfidDebug LfRfidDebug;
  type LfRfidDebug (line 17) | struct LfRfidDebug {
  type LfRfidDebugView (line 27) | typedef enum {

FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_app_scene_start.c
  type SubmenuIndex (line 3) | typedef enum {
  function lfrfid_debug_scene_start_submenu_callback (line 7) | static void lfrfid_debug_scene_start_submenu_callback(void* context, uin...
  function lfrfid_debug_scene_start_on_enter (line 13) | void lfrfid_debug_scene_start_on_enter(void* context) {
  function lfrfid_debug_scene_start_on_event (line 26) | bool lfrfid_debug_scene_start_on_event(void* context, SceneManagerEvent ...
  function lfrfid_debug_scene_start_on_exit (line 40) | void lfrfid_debug_scene_start_on_exit(void* context) {

FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_app_scene_tune.c
  function comparator_trigger_callback (line 4) | static void comparator_trigger_callback(bool level, void* comp_ctx) {
  function lfrfid_debug_view_tune_callback (line 9) | void lfrfid_debug_view_tune_callback(void* context) {
  function lfrfid_debug_scene_tune_on_enter (line 14) | void lfrfid_debug_scene_tune_on_enter(void* context) {
  function lfrfid_debug_scene_tune_on_event (line 29) | bool lfrfid_debug_scene_tune_on_event(void* context, SceneManagerEvent e...
  function lfrfid_debug_scene_tune_on_exit (line 43) | void lfrfid_debug_scene_tune_on_exit(void* context) {

FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.h
  type LfRfidDebugScene (line 7) | typedef enum {

FILE: applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c
  type LfRfidTuneView (line 6) | struct LfRfidTuneView {
  type LfRfidTuneViewModel (line 10) | typedef struct {
  function lfrfid_debug_view_tune_draw_callback (line 20) | static void lfrfid_debug_view_tune_draw_callback(Canvas* canvas, void* _...
  function lfrfid_debug_view_tune_button_up (line 55) | static void lfrfid_debug_view_tune_button_up(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_button_down (line 65) | static void lfrfid_debug_view_tune_button_down(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_button_left (line 75) | static void lfrfid_debug_view_tune_button_left(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_button_right (line 99) | static void lfrfid_debug_view_tune_button_right(LfRfidTuneView* tune_vie...
  function lfrfid_debug_view_tune_button_ok (line 123) | static void lfrfid_debug_view_tune_button_ok(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_input_callback (line 128) | static bool lfrfid_debug_view_tune_input_callback(InputEvent* event, voi...
  function LfRfidTuneView (line 173) | LfRfidTuneView* lfrfid_debug_view_tune_alloc(void) {
  function lfrfid_debug_view_tune_free (line 185) | void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view) {
  function View (line 190) | View* lfrfid_debug_view_tune_get_view(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_clean (line 194) | void lfrfid_debug_view_tune_clean(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_is_dirty (line 210) | bool lfrfid_debug_view_tune_is_dirty(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_get_arr (line 224) | uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_get_ccr (line 231) | uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view) {
  function lfrfid_debug_view_tune_set_callback (line 238) | void lfrfid_debug_view_tune_set_callback(

FILE: applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h
  type LfRfidTuneView (line 4) | typedef struct LfRfidTuneView LfRfidTuneView;

FILE: applications/debug/loader_chaining_a/loader_chaining_a.c
  type LoaderChainingA (line 12) | typedef struct {
  type LoaderChainingASubmenu (line 22) | typedef enum {
  function loader_chaining_a_submenu_callback (line 30) | static void loader_chaining_a_submenu_callback(void* context, uint32_t i...
  function loader_chaining_a_nav_callback (line 74) | static bool loader_chaining_a_nav_callback(void* context) {
  function LoaderChainingA (line 80) | LoaderChainingA* loader_chaining_a_alloc(void) {
  function loader_chaining_a_free (line 130) | void loader_chaining_a_free(LoaderChainingA* app) {
  function chaining_test_app_a (line 140) | int32_t chaining_test_app_a(const char* arg) {

FILE: applications/debug/loader_chaining_b/loader_chaining_b.c
  function chaining_test_app_b (line 5) | int32_t chaining_test_app_b(const char* arg) {

FILE: applications/debug/locale_test/locale_test.c
  type LocaleTestApp (line 8) | typedef struct {
  function locale_test_view_draw_callback (line 14) | static void locale_test_view_draw_callback(Canvas* canvas, void* _model) {
  function locale_test_view_input_callback (line 45) | static bool locale_test_view_input_callback(InputEvent* event, void* con...
  function locale_test_exit (line 51) | static uint32_t locale_test_exit(void* context) {
  function LocaleTestApp (line 56) | static LocaleTestApp* locale_test_alloc(void) {
  function locale_test_free (line 78) | static void locale_test_free(LocaleTestApp* app) {
  function locale_test_app (line 95) | int32_t locale_test_app(void* p) {

FILE: applications/debug/rpc_debug_app/rpc_debug_app.c
  function rpc_debug_app_custom_event_callback (line 6) | static bool rpc_debug_app_custom_event_callback(void* context, uint32_t ...
  function rpc_debug_app_back_event_callback (line 12) | static bool rpc_debug_app_back_event_callback(void* context) {
  function rpc_debug_app_tick_event_callback (line 18) | static void rpc_debug_app_tick_event_callback(void* context) {
  function rpc_debug_app_format_hex (line 24) | static void
  function rpc_debug_app_rpc_command_callback (line 45) | static void rpc_debug_app_rpc_command_callback(const RpcAppSystemEvent* ...
  function rpc_debug_app_rpc_init_rpc (line 72) | static bool rpc_debug_app_rpc_init_rpc(RpcDebugApp* app, const char* arg...
  function RpcDebugApp (line 86) | static RpcDebugApp* rpc_debug_app_alloc(void) {
  function rpc_debug_app_free (line 122) | static void rpc_debug_app_free(RpcDebugApp* app) {
  function rpc_debug_app (line 152) | int32_t rpc_debug_app(void* args) {

FILE: applications/debug/rpc_debug_app/rpc_debug_app.h
  type RpcDebugApp (line 23) | typedef struct {
  type RpcDebugAppView (line 40) | typedef enum {
  type RpcDebugAppCustomEvent (line 48) | typedef enum {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene.h
  type RpcDebugAppScene (line 7) | typedef enum {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_data_exchange.c
  function rpc_debug_app_scene_input_data_exchange_result_callback (line 3) | static void rpc_debug_app_scene_input_data_exchange_result_callback(void...
  function rpc_debug_app_scene_input_data_exchange_on_enter (line 9) | void rpc_debug_app_scene_input_data_exchange_on_enter(void* context) {
  function rpc_debug_app_scene_input_data_exchange_on_event (line 22) | bool rpc_debug_app_scene_input_data_exchange_on_event(void* context, Sce...
  function rpc_debug_app_scene_input_data_exchange_on_exit (line 37) | void rpc_debug_app_scene_input_data_exchange_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_error_code.c
  function rpc_debug_app_scene_input_error_code_validator_callback (line 5) | static bool rpc_debug_app_scene_input_error_code_validator_callback(
  function rpc_debug_app_scene_input_error_code_result_callback (line 22) | static void rpc_debug_app_scene_input_error_code_result_callback(void* c...
  function rpc_debug_app_scene_input_error_code_on_enter (line 27) | void rpc_debug_app_scene_input_error_code_on_enter(void* context) {
  function rpc_debug_app_scene_input_error_code_on_event (line 43) | bool rpc_debug_app_scene_input_error_code_on_event(void* context, SceneM...
  function rpc_debug_app_scene_input_error_code_on_exit (line 61) | void rpc_debug_app_scene_input_error_code_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_error_text.c
  function rpc_debug_app_scene_input_error_text_result_callback (line 3) | static void rpc_debug_app_scene_input_error_text_result_callback(void* c...
  function rpc_debug_app_scene_input_error_text_on_enter (line 8) | void rpc_debug_app_scene_input_error_text_on_enter(void* context) {
  function rpc_debug_app_scene_input_error_text_on_event (line 22) | bool rpc_debug_app_scene_input_error_text_on_event(void* context, SceneM...
  function rpc_debug_app_scene_input_error_text_on_exit (line 37) | void rpc_debug_app_scene_input_error_text_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_receive_data_exchange.c
  function rpc_debug_app_scene_receive_data_exchange_on_enter (line 3) | void rpc_debug_app_scene_receive_data_exchange_on_enter(void* context) {
  function rpc_debug_app_scene_receive_data_exchange_on_event (line 13) | bool rpc_debug_app_scene_receive_data_exchange_on_event(void* context, S...
  function rpc_debug_app_scene_receive_data_exchange_on_exit (line 30) | void rpc_debug_app_scene_receive_data_exchange_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_start.c
  type SubmenuIndex (line 3) | enum SubmenuIndex {
  function rpc_debug_app_scene_start_submenu_callback (line 8) | static void rpc_debug_app_scene_start_submenu_callback(void* context, ui...
  function rpc_debug_app_scene_start_on_enter (line 13) | void rpc_debug_app_scene_start_on_enter(void* context) {
  function rpc_debug_app_scene_start_on_event (line 34) | bool rpc_debug_app_scene_start_on_event(void* context, SceneManagerEvent...
  function rpc_debug_app_scene_start_on_exit (line 54) | void rpc_debug_app_scene_start_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_start_dummy.c
  function rpc_debug_app_scene_start_dummy_on_enter (line 3) | void rpc_debug_app_scene_start_dummy_on_enter(void* context) {
  function rpc_debug_app_scene_start_dummy_on_event (line 18) | bool rpc_debug_app_scene_start_dummy_on_event(void* context, SceneManage...
  function rpc_debug_app_scene_start_dummy_on_exit (line 27) | void rpc_debug_app_scene_start_dummy_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_test_app_error.c
  type SubmenuIndex (line 3) | typedef enum {
  function rpc_debug_app_scene_test_app_error_submenu_callback (line 8) | static void rpc_debug_app_scene_test_app_error_submenu_callback(void* co...
  function rpc_debug_app_scene_test_app_error_on_enter (line 13) | void rpc_debug_app_scene_test_app_error_on_enter(void* context) {
  function rpc_debug_app_scene_test_app_error_on_event (line 34) | bool rpc_debug_app_scene_test_app_error_on_event(void* context, SceneMan...
  function rpc_debug_app_scene_test_app_error_on_exit (line 54) | void rpc_debug_app_scene_test_app_error_on_exit(void* context) {

FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_test_data_exchange.c
  type SubmenuIndex (line 3) | typedef enum {
  function rpc_debug_app_scene_test_data_exchange_submenu_callback (line 8) | static void
  function rpc_debug_app_scene_test_data_exchange_on_enter (line 14) | void rpc_debug_app_scene_test_data_exchange_on_enter(void* context) {
  function rpc_debug_app_scene_test_data_exchange_on_event (line 35) | bool rpc_debug_app_scene_test_data_exchange_on_event(void* context, Scen...
  function rpc_debug_app_scene_test_data_exchange_on_exit (line 55) | void rpc_debug_app_scene_test_data_exchange_on_exit(void* context) {

FILE: applications/debug/speaker_debug/speaker_debug.c
  type SpeakerDebugAppMessageType (line 13) | typedef enum {
  type SpeakerDebugAppMessage (line 17) | typedef struct {
  type SpeakerDebugApp (line 21) | typedef struct {
  function SpeakerDebugApp (line 27) | static SpeakerDebugApp* speaker_app_alloc(void) {
  function speaker_app_free (line 35) | static void speaker_app_free(SpeakerDebugApp* app) {
  function speaker_app_cli (line 42) | static void speaker_app_cli(PipeSide* pipe, FuriString* args, void* cont...
  function speaker_app_music_play (line 72) | static bool speaker_app_music_play(SpeakerDebugApp* app, const char* rtt...
  function speaker_app_music_stop (line 88) | static void speaker_app_music_stop(SpeakerDebugApp* app) {
  function speaker_app_run (line 94) | static void speaker_app_run(SpeakerDebugApp* app, const char* arg) {
  function speaker_debug_app (line 119) | int32_t speaker_debug_app(void* arg) {

FILE: applications/debug/subghz_test/helpers/subghz_test_event.h
  type SubGhzTestCustomEvent (line 3) | typedef enum {

FILE: applications/debug/subghz_test/helpers/subghz_test_types.h
  type SubGhzTestView (line 10) | typedef enum {

FILE: applications/debug/subghz_test/protocol/math.c
  function subghz_protocol_blocks_reverse_key (line 3) | uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_co...
  function subghz_protocol_blocks_get_parity (line 11) | uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_coun...
  function subghz_protocol_blocks_crc4 (line 19) | uint8_t subghz_protocol_blocks_crc4(
  function subghz_protocol_blocks_crc7 (line 41) | uint8_t subghz_protocol_blocks_crc7(
  function subghz_protocol_blocks_crc8 (line 62) | uint8_t subghz_protocol_blocks_crc8(
  function subghz_protocol_blocks_crc8le (line 82) | uint8_t subghz_protocol_blocks_crc8le(
  function subghz_protocol_blocks_crc16lsb (line 103) | uint16_t subghz_protocol_blocks_crc16lsb(
  function subghz_protocol_blocks_crc16 (line 123) | uint16_t subghz_protocol_blocks_crc16(
  function subghz_protocol_blocks_lfsr_digest8 (line 143) | uint8_t subghz_protocol_blocks_lfsr_digest8(
  function subghz_protocol_blocks_lfsr_digest8_reflect (line 166) | uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
  function subghz_protocol_blocks_lfsr_digest16 (line 193) | uint16_t subghz_protocol_blocks_lfsr_digest16(
  function subghz_protocol_blocks_add_bytes (line 216) | uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t...
  function subghz_protocol_blocks_parity8 (line 224) | uint8_t subghz_protocol_blocks_parity8(uint8_t byte) {
  function subghz_protocol_blocks_parity_bytes (line 230) | uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], siz...
  function subghz_protocol_blocks_xor_bytes (line 238) | uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t...

FILE: applications/debug/subghz_test/protocol/princeton_for_testing.c
  type SubGhzEncoderPrinceton (line 22) | struct SubGhzEncoderPrinceton {
  type PrincetonDecoderStep (line 35) | typedef enum {
  function SubGhzEncoderPrinceton (line 41) | SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void) {
  function subghz_encoder_princeton_for_testing_free (line 46) | void subghz_encoder_princeton_for_testing_free(SubGhzEncoderPrinceton* i...
  function subghz_encoder_princeton_for_testing_stop (line 51) | void subghz_encoder_princeton_for_testing_stop(
  function subghz_encoder_princeton_for_testing_set (line 57) | void subghz_encoder_princeton_for_testing_set(
  function subghz_encoder_princeton_for_testing_get_repeat_left (line 86) | size_t subghz_encoder_princeton_for_testing_get_repeat_left(SubGhzEncode...
  function subghz_encoder_princeton_for_testing_print_log (line 91) | void subghz_encoder_princeton_for_testing_print_log(void* context) {
  function LevelDuration (line 105) | LevelDuration subghz_encoder_princeton_for_testing_yield(void* context) {
  type SubGhzDecoderPrinceton (line 170) | struct SubGhzDecoderPrinceton {
  function SubGhzDecoderPrinceton (line 191) | SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(void) {
  function subghz_decoder_princeton_for_testing_free (line 203) | void subghz_decoder_princeton_for_testing_free(SubGhzDecoderPrinceton* i...
  function subghz_decoder_princeton_for_testing_set_callback (line 208) | void subghz_decoder_princeton_for_testing_set_callback(
  function subghz_decoder_princeton_for_testing_reset (line 216) | void subghz_decoder_princeton_for_testing_reset(SubGhzDecoderPrinceton* ...
  function subghz_decoder_princeton_for_testing_add_bit (line 220) | static void
  function subghz_decoder_princeton_for_testing_parse (line 226) | void subghz_decoder_princeton_for_testing_parse(

FILE: applications/debug/subghz_test/protocol/princeton_for_testing.h
  type SubGhzDecoderPrinceton (line 8) | typedef struct SubGhzDecoderPrinceton SubGhzDecoderPrinceton;
  type SubGhzEncoderPrinceton (line 10) | typedef struct SubGhzEncoderPrinceton SubGhzEncoderPrinceton;

FILE: applications/debug/subghz_test/scenes/subghz_test_scene.h
  type SubGhzTestScene (line 7) | typedef enum {

FILE: applications/debug/subghz_test/scenes/subghz_test_scene_about.c
  function subghz_test_scene_about_widget_callback (line 3) | void subghz_test_scene_about_widget_callback(GuiButtonType result, Input...
  function subghz_test_scene_about_on_enter (line 10) | void subghz_test_scene_about_on_enter(void* context) {
  function subghz_test_scene_about_on_event (line 52) | bool subghz_test_scene_about_on_event(void* context, SceneManagerEvent e...
  function subghz_test_scene_about_on_exit (line 61) | void subghz_test_scene_about_on_exit(void* context) {

FILE: applications/debug/subghz_test/scenes/subghz_test_scene_carrier.c
  function subghz_test_scene_carrier_callback (line 3) | void subghz_test_scene_carrier_callback(SubGhzTestCarrierEvent event, vo...
  function subghz_test_scene_carrier_on_enter (line 9) | void subghz_test_scene_carrier_on_enter(void* context) {
  function subghz_test_scene_carrier_on_event (line 16) | bool subghz_test_scene_carrier_on_event(void* context, SceneManagerEvent...
  function subghz_test_scene_carrier_on_exit (line 27) | void subghz_test_scene_carrier_on_exit(void* context) {

FILE: applications/debug/subghz_test/scenes/subghz_test_scene_packet.c
  function subghz_test_scene_packet_callback (line 3) | void subghz_test_scene_packet_callback(SubGhzTestPacketEvent event, void...
  function subghz_test_scene_packet_on_enter (line 9) | void subghz_test_scene_packet_on_enter(void* context) {
  function subghz_test_scene_packet_on_event (line 16) | bool subghz_test_scene_packet_on_event(void* context, SceneManagerEvent ...
  function subghz_test_scene_packet_on_exit (line 27) | void subghz_test_scene_packet_on_exit(void* context) {

FILE: applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c
  function subghz_test_scene_show_only_rx_popup_callback (line 4) | void subghz_test_scene_show_only_rx_popup_callback(void* context) {
  function subghz_test_scene_show_only_rx_on_enter (line 9) | void subghz_test_scene_show_only_rx_on_enter(void* context) {
  function subghz_test_scene_show_only_rx_on_event (line 33) | bool subghz_test_scene_show_only_rx_on_event(void* context, SceneManager...
  function subghz_test_scene_show_only_rx_on_exit (line 44) | void subghz_test_scene_show_only_rx_on_exit(void* context) {

FILE: applications/debug/subghz_test/scenes/subghz_test_scene_start.c
  type SubmenuIndex (line 3) | typedef enum {
  function subghz_test_scene_start_submenu_callback (line 10) | void subghz_test_scene_start_submenu_callback(void* context, uint32_t in...
  function subghz_test_scene_start_on_enter (line 15) | void subghz_test_scene_start_on_enter(void* context) {
  function subghz_test_scene_start_on_event (line 50) | bool subghz_test_scene_start_on_event(void* context, SceneManagerEvent e...
  function subghz_test_scene_start_on_exit (line 74) | void subghz_test_scene_start_on_exit(void* context) {

FILE: applications/debug/subghz_test/scenes/subghz_test_scene_static.c
  function subghz_test_scene_static_callback (line 3) | void subghz_test_scene_static_callback(SubGhzTestStaticEvent event, void...
  function subghz_test_scene_static_on_enter (line 9) | void subghz_test_scene_static_on_enter(void* context) {
  function subghz_test_scene_static_on_event (line 16) | bool subghz_test_scene_static_on_event(void* context, SceneManagerEvent ...
  function subghz_test_scene_static_on_exit (line 27) | void subghz_test_scene_static_on_exit(void* context) {

FILE: applications/debug/subghz_test/subghz_test_app.c
  function subghz_test_app_custom_event_callback (line 6) | static bool subghz_test_app_custom_event_callback(void* context, uint32_...
  function subghz_test_app_back_event_callback (line 12) | static bool subghz_test_app_back_event_callback(void* context) {
  function subghz_test_app_tick_event_callback (line 18) | static void subghz_test_app_tick_event_callback(void* context) {
  function SubGhzTestApp (line 24) | SubGhzTestApp* subghz_test_app_alloc(void) {
  function subghz_test_app_free (line 88) | void subghz_test_app_free(SubGhzTestApp* app) {
  function subghz_test_app (line 129) | int32_t subghz_test_app(void* p) {

FILE: applications/debug/subghz_test/subghz_test_app_i.h
  type SubGhzTestApp (line 19) | typedef struct SubGhzTestApp SubGhzTestApp;
  type SubGhzTestApp (line 21) | struct SubGhzTestApp {

FILE: applications/debug/subghz_test/views/subghz_test_carrier.c
  type SubGhzTestCarrier (line 10) | struct SubGhzTestCarrier {
  type SubGhzTestCarrierModelStatus (line 17) | typedef enum {
  type SubGhzTestCarrierModel (line 22) | typedef struct {
  function subghz_test_carrier_set_callback (line 30) | void subghz_test_carrier_set_callback(
  function subghz_test_carrier_draw (line 40) | void subghz_test_carrier_draw(Canvas* canvas, SubGhzTestCarrierModel* mo...
  function subghz_test_carrier_input (line 83) | bool subghz_test_carrier_input(InputEvent* event, void* context) {
  function subghz_test_carrier_enter (line 136) | void subghz_test_carrier_enter(void* context) {
  function subghz_test_carrier_exit (line 163) | void subghz_test_carrier_exit(void* context) {
  function subghz_test_carrier_rssi_timer_callback (line 173) | void subghz_test_carrier_rssi_timer_callback(void* context) {
  function SubGhzTestCarrier (line 188) | SubGhzTestCarrier* subghz_test_carrier_alloc(void) {
  function subghz_test_carrier_free (line 207) | void subghz_test_carrier_free(SubGhzTestCarrier* subghz_test_carrier) {
  function View (line 214) | View* subghz_test_carrier_get_view(SubGhzTestCarrier* subghz_test_carrie...

FILE: applications/debug/subghz_test/views/subghz_test_carrier.h
  type SubGhzTestCarrierEvent (line 5) | typedef enum {
  type SubGhzTestCarrier (line 9) | typedef struct SubGhzTestCarrier SubGhzTestCarrier;

FILE: applications/debug/subghz_test/views/subghz_test_packet.c
  type SubGhzTestPacket (line 14) | struct SubGhzTestPacket {
  type SubGhzTestPacketModelStatus (line 25) | typedef enum {
  type SubGhzTestPacketModel (line 31) | typedef struct {
  function subghz_test_packet_set_callback (line 42) | void subghz_test_packet_set_callback(
  function subghz_test_packet_rx_callback (line 52) | static void subghz_test_packet_rx_callback(bool level, uint32_t duration...
  function subghz_test_packet_rx_pt_callback (line 58) | static void subghz_test_packet_rx_pt_callback(SubGhzDecoderPrinceton* pa...
  function subghz_test_packet_rssi_timer_callback (line 65) | static void subghz_test_packet_rssi_timer_callback(void* context) {
  function subghz_test_packet_draw (line 85) | static void subghz_test_packet_draw(Canvas* canvas, SubGhzTestPacketMode...
  function subghz_test_packet_input (line 132) | static bool subghz_test_packet_input(InputEvent* event, void* context) {
  function subghz_test_packet_enter (line 191) | void subghz_test_packet_enter(void* context) {
  function subghz_test_packet_exit (line 216) | void subghz_test_packet_exit(void* context) {
  function SubGhzTestPacket (line 238) | SubGhzTestPacket* subghz_test_packet_alloc(void) {
  function subghz_test_packet_free (line 261) | void subghz_test_packet_free(SubGhzTestPacket* instance) {
  function View (line 272) | View* subghz_test_packet_get_view(SubGhzTestPacket* instance) {

FILE: applications/debug/subghz_test/views/subghz_test_packet.h
  type SubGhzTestPacketEvent (line 5) | typedef enum {
  type SubGhzTestPacket (line 9) | typedef struct SubGhzTestPacket SubGhzTestPacket;

FILE: applications/debug/subghz_test/views/subghz_test_static.c
  type SubGhzTestStaticStatus (line 13) | typedef enum {
  type SubGhzTestStatic (line 25) | struct SubGhzTestStatic {
  type SubGhzTestStaticModel (line 33) | typedef struct {
  function subghz_test_static_set_callback (line 39) | void subghz_test_static_set_callback(
  function subghz_test_static_draw (line 49) | void subghz_test_static_draw(Canvas* canvas, SubGhzTestStaticModel* mode...
  function subghz_test_static_input (line 70) | bool subghz_test_static_input(InputEvent* event, void* context) {
  function subghz_test_static_enter (line 138) | void subghz_test_static_enter(void* context) {
  function subghz_test_static_exit (line 160) | void subghz_test_static_exit(void* context) {
  function SubGhzTestStatic (line 165) | SubGhzTestStatic* subghz_test_static_alloc(void) {
  function subghz_test_static_free (line 182) | void subghz_test_static_free(SubGhzTestStatic* instance) {
  function View (line 189) | View* subghz_test_static_get_view(SubGhzTestStatic* instance) {

FILE: applications/debug/subghz_test/views/subghz_test_static.h
  type SubGhzTestStaticEvent (line 5) | typedef enum {
  type SubGhzTestStatic (line 9) | typedef struct SubGhzTestStatic SubGhzTestStatic;

FILE: applications/debug/text_box_element_test/text_box_element_test.c
  function text_box_center_top_secondary_128x22 (line 8) | static void text_box_center_top_secondary_128x22(Canvas* canvas) {
  function text_box_right_bottom_bold_128x22 (line 13) | static void text_box_right_bottom_bold_128x22(Canvas* canvas) {
  function text_box_left_center_mixed_80x50 (line 19) | static void text_box_left_center_mixed_80x50(Canvas* canvas) {
  function text_box_center_center_secondary_110x44 (line 33) | static void text_box_center_center_secondary_110x44(Canvas* canvas) {
  type TextBoxTestState (line 54) | typedef struct {
  function text_box_test_render_callback (line 59) | static void text_box_test_render_callback(Canvas* canvas, void* ctx) {
  function text_box_test_input_callback (line 69) | static void text_box_test_input_callback(InputEvent* input_event, void* ...
  function text_box_element_test_app (line 74) | int32_t text_box_element_test_app(void* p) {

FILE: applications/debug/text_box_view_test/text_box_view_test.c
  type TextBoxViewTestContent (line 9) | typedef struct {
  type TextBoxViewTest (line 80) | typedef struct {
  function text_box_update_view (line 86) | static void text_box_update_view(TextBoxViewTest* instance) {
  function text_box_switch_view_input_callback (line 97) | static bool text_box_switch_view_input_callback(InputEvent* event, void*...
  function text_box_view_test_app (line 123) | int32_t text_box_view_test_app(void* p) {

FILE: applications/debug/uart_echo/uart_echo.c
  type UartDumpModel (line 23) | typedef struct UartDumpModel UartDumpModel;
  type UartEchoApp (line 25) | typedef struct {
  type ListElement (line 35) | typedef struct {
  type UartDumpModel (line 39) | struct UartDumpModel {
  type WorkerEventFlags (line 47) | typedef enum {
  function uart_echo_view_draw_callback (line 76) | static void uart_echo_view_draw_callback(Canvas* canvas, void* _model) {
  function uart_echo_view_input_callback (line 105) | static bool uart_echo_view_input_callback(InputEvent* event, void* conte...
  function uart_echo_exit (line 111) | static uint32_t uart_echo_exit(void* context) {
  function uart_echo_on_irq_cb (line 116) | static void
  function uart_echo_push_to_list (line 154) | static void uart_echo_push_to_list(UartDumpModel* model, const char data) {
  function uart_echo_worker (line 196) | static int32_t uart_echo_worker(void* context) {
  function UartEchoApp (line 254) | static UartEchoApp* uart_echo_app_alloc(
  function uart_echo_app_free (line 307) | static void uart_echo_app_free(UartEchoApp* app) {
  function uart_echo_app (line 347) | int32_t uart_echo_app(void* p) {

FILE: applications/debug/unit_tests/test_runner.c
  type TestRunner (line 23) | struct TestRunner {
  function TestRunner (line 42) | TestRunner* test_runner_alloc(PipeSide* pipe, FuriString* args) {
  function test_runner_free (line 59) | void test_runner_free(TestRunner* instance) {
  function test_runner_run_plugin (line 79) | static bool test_runner_run_plugin(TestRunner* instance, const char* pat...
  function test_runner_run_internal (line 126) | static void test_runner_run_internal(TestRunner* instance) {
  function test_runner_run (line 193) | void test_runner_run(TestRunner* instance) {

FILE: applications/debug/unit_tests/test_runner.h
  type TestRunner (line 6) | typedef struct TestRunner TestRunner;

FILE: applications/debug/unit_tests/tests/args/args_test.c
  function MU_TEST (line 10) | MU_TEST(args_read_duration_default_values_test) {
  function MU_TEST (line 50) | MU_TEST(args_read_duration_suffix_values_test) {
  function MU_TEST (line 83) | MU_TEST(args_read_duration_values_test) {
  function MU_TEST (line 136) | MU_TEST(args_read_duration_errors_test) {
  function MU_TEST_SUITE (line 199) | MU_TEST_SUITE(toolbox_args_read_duration_suite) {
  function run_minunit_test_toolbox_args (line 206) | int run_minunit_test_toolbox_args(void) {

FILE: applications/debug/unit_tests/tests/bit_lib/bit_lib_test.c
  function MU_TEST (line 5) | MU_TEST(test_bit_lib_increment_index) {
  function MU_TEST (line 21) | MU_TEST(test_bit_lib_is_set) {
  function MU_TEST (line 35) | MU_TEST(test_bit_lib_push) {
  function MU_TEST (line 82) | MU_TEST(test_bit_lib_set_bit) {
  function MU_TEST (line 119) | MU_TEST(test_bit_lib_set_bits) {
  function MU_TEST (line 142) | MU_TEST(test_bit_lib_get_bit) {
  function MU_TEST (line 152) | MU_TEST(test_bit_lib_get_bits) {
  function MU_TEST (line 165) | MU_TEST(test_bit_lib_get_bits_16) {
  function MU_TEST (line 185) | MU_TEST(test_bit_lib_get_bits_32) {
  function MU_TEST (line 221) | MU_TEST(test_bit_lib_get_bits_64) {
  function MU_TEST (line 393) | MU_TEST(test_bit_lib_test_parity_u32) {
  function MU_TEST (line 433) | MU_TEST(test_bit_lib_test_parity) {
  function MU_TEST (line 485) | MU_TEST(test_bit_lib_remove_bit_every_nth) {
  function MU_TEST (line 496) | MU_TEST(test_bit_lib_reverse_bits) {
  function MU_TEST (line 512) | MU_TEST(test_bit_lib_copy_bits) {
  function MU_TEST (line 526) | MU_TEST(test_bit_lib_get_bit_count) {
  function MU_TEST (line 538) | MU_TEST(test_bit_lib_reverse_16_fast) {
  function MU_TEST (line 545) | MU_TEST(test_bit_lib_crc16) {
  function MU_TEST (line 622) | MU_TEST(test_bit_lib_num_to_bytes_be) {
  function MU_TEST (line 639) | MU_TEST(test_bit_lib_num_to_bytes_le) {
  function MU_TEST (line 658) | MU_TEST(test_bit_lib_bytes_to_num_be) {
  function MU_TEST (line 673) | MU_TEST(test_bit_lib_bytes_to_num_le) {
  function MU_TEST (line 688) | MU_TEST(test_bit_lib_bytes_to_num_bcd) {
  function MU_TEST_SUITE (line 711) | MU_TEST_SUITE(test_bit_lib) {
  function run_minunit_test_bit_lib (line 737) | int run_minunit_test_bit_lib(void) {

FILE: applications/debug/unit_tests/tests/bt/bt_test.c
  type BtTest (line 24) | typedef struct {
  function bt_test_alloc (line 33) | void bt_test_alloc(void) {
  function bt_test_free (line 43) | void bt_test_free(void) {
  function bt_test_keys_storage_profile (line 53) | static void bt_test_keys_storage_profile(void) {
  function bt_test_keys_remove_test_file (line 98) | static void bt_test_keys_remove_test_file(void) {
  function bt_test_create_v0_file (line 105) | static bool
  function bt_test_verify_file_version (line 117) | static bool bt_test_verify_file_version(const char* file_path, uint32_t ...
  function bt_test_migration_v0_to_v1 (line 129) | static void bt_test_migration_v0_to_v1(void) {
  function bt_test_migration_preserves_pairings_and_keys (line 175) | static void bt_test_migration_preserves_pairings_and_keys(void) {
  function bt_test_delete_generates_new_keys_and_not_legacy (line 208) | static void bt_test_delete_generates_new_keys_and_not_legacy(void) {
  function MU_TEST (line 232) | MU_TEST(bt_test_keys_storage_serial_profile) {
  function MU_TEST (line 240) | MU_TEST(bt_test_migration_v0_to_v1_test) {
  function MU_TEST (line 245) | MU_TEST(bt_test_migration_preserves_pairings_and_keys_test) {
  function MU_TEST (line 250) | MU_TEST(bt_test_delete_generates_new_keys_and_not_legacy_test) {
  function MU_TEST_SUITE (line 255) | MU_TEST_SUITE(test_bt) {
  function run_minunit_test_bt (line 266) | int run_minunit_test_bt(void) {

FILE: applications/debug/unit_tests/tests/common/common.c
  function minunit_print_progress (line 6) | void minunit_print_progress(void) {
  function minunit_print_fail (line 18) | void minunit_print_fail(const char* str) {
  function minunit_printf_warning (line 22) | void minunit_printf_warning(const char* format, ...) {
  function get_minunit_run (line 32) | int get_minunit_run(void) {
  function get_minunit_assert (line 36) | int get_minunit_assert(void) {
  function get_minunit_status (line 40) | int get_minunit_status(void) {

FILE: applications/debug/unit_tests/tests/compress/compress_test.c
  function compress_test_reference_comp_decomp (line 18) | static void compress_test_reference_comp_decomp() {
  function compress_test_random_comp_decomp (line 96) | static void compress_test_random_comp_decomp() {
  function hs_unpacker_file_read (line 152) | static int32_t hs_unpacker_file_read(void* context, uint8_t* buffer, siz...
  function hs_unpacker_file_write (line 157) | static int32_t hs_unpacker_file_write(void* context, uint8_t* buffer, si...
  function compress_test_heatshrink_stream (line 179) | static void compress_test_heatshrink_stream() {
  function file_counter (line 245) | static bool file_counter(const char* name, bool is_dir, void* context) {
  function compress_test_heatshrink_tar (line 265) | static void compress_test_heatshrink_tar() {
  function MU_TEST_SUITE (line 341) | MU_TEST_SUITE(test_compress) {
  function run_minunit_test_compress (line 348) | int run_minunit_test_compress(void) {

FILE: applications/debug/unit_tests/tests/datetime/datetimelib_test.c
  function MU_TEST (line 6) | MU_TEST(test_datetime_validate_datetime_correct_min) {
  function MU_TEST (line 13) | MU_TEST(test_datetime_validate_datetime_correct_max) {
  function MU_TEST (line 20) | MU_TEST(test_datetime_validate_datetime_incorrect_second) {
  function MU_TEST (line 27) | MU_TEST(test_datetime_validate_datetime_incorrect_minute) {
  function MU_TEST (line 34) | MU_TEST(test_datetime_validate_datetime_incorrect_hour) {
  function MU_TEST (line 41) | MU_TEST(test_datetime_validate_datetime_incorrect_day_min) {
  function MU_TEST (line 48) | MU_TEST(test_datetime_validate_datetime_incorrect_day_max) {
  function MU_TEST (line 55) | MU_TEST(test_datetime_validate_datetime_incorrect_month_min) {
  function MU_TEST (line 62) | MU_TEST(test_datetime_validate_datetime_incorrect_month_max) {
  function MU_TEST (line 69) | MU_TEST(test_datetime_validate_datetime_incorrect_year_min) {
  function MU_TEST (line 76) | MU_TEST(test_datetime_validate_datetime_incorrect_year_max) {
  function MU_TEST (line 83) | MU_TEST(test_datetime_validate_datetime_incorrect_weekday_min) {
  function MU_TEST (line 90) | MU_TEST(test_datetime_validate_datetime_incorrect_weekday_max) {
  function MU_TEST_SUITE (line 97) | MU_TEST_SUITE(test_datetime_validate_datetime) {
  function MU_TEST (line 113) | MU_TEST(test_datetime_timestamp_to_datetime_min) {
  function MU_TEST (line 123) | MU_TEST(test_datetime_timestamp_to_datetime_max) {
  function MU_TEST (line 133) | MU_TEST(test_datetime_timestamp_to_datetime_to_timestamp) {
  function MU_TEST (line 144) | MU_TEST(test_datetime_timestamp_to_datetime_weekday) {
  function MU_TEST_SUITE (line 159) | MU_TEST_SUITE(test_datetime_timestamp_to_datetime_suite) {
  function MU_TEST (line 166) | MU_TEST(test_datetime_datetime_to_timestamp_min) {
  function MU_TEST (line 173) | MU_TEST(test_datetime_datetime_to_timestamp_max) {
  function MU_TEST_SUITE (line 180) | MU_TEST_SUITE(test_datetime_datetime_to_timestamp_suite) {
  function run_minunit_test_datetime (line 185) | int run_minunit_test_datetime(void) {

FILE: applications/debug/unit_tests/tests/dialogs_file_browser_options/dialogs_file_browser_options.c
  function MU_TEST (line 5) | MU_TEST(test_dialog_file_browser_set_basic_options_should_init_all_field...
  function MU_TEST_SUITE (line 24) | MU_TEST_SUITE(dialogs_file_browser_options) {
  function run_minunit_test_dialogs_file_browser_options (line 28) | int run_minunit_test_dialogs_file_browser_options(void) {

FILE: applications/debug/unit_tests/tests/dirwalk/dirwalk_test.c
  type StorageTestPathDesc (line 30) | typedef struct {
  type StorageTestPath (line 73) | typedef struct {
  function StorageTestPathDict_t (line 80) | static StorageTestPathDict_t*
  function storage_test_paths_free (line 100) | static void storage_test_paths_free(StorageTestPathDict_t* data) {
  function storage_test_paths_mark (line 105) | static bool storage_test_paths_mark(StorageTestPathDict_t* data, FuriStr...
  function storage_test_paths_check (line 121) | static bool storage_test_paths_check(StorageTestPathDict_t* data) {
  function write_file_13DA (line 138) | static bool write_file_13DA(Storage* storage, const char* path) {
  function storage_dirs_create (line 150) | static void storage_dirs_create(Storage* storage, const char* base) {
  function test_dirwalk_filter_no_folder_ext (line 218) | static bool test_dirwalk_filter_no_folder_ext(const char* name, FileInfo...
  function MU_TEST_SUITE (line 257) | MU_TEST_SUITE(test_dirwalk_suite) {
  function run_minunit_test_dirwalk (line 269) | int run_minunit_test_dirwalk(void) {

FILE: applications/debug/unit_tests/tests/expansion/expansion_test.c
  function MU_TEST (line 12) | MU_TEST(test_expansion_encoded_size) {
  function MU_TEST (line 34) | MU_TEST(test_expansion_remaining_size) {
  type TestExpansionSendStream (line 95) | typedef struct {
  function test_expansion_send_callback (line 101) | static size_t test_expansion_send_callback(const uint8_t* data, size_t d...
  type TestExpansionReceiveStream (line 113) | typedef struct {
  function test_expansion_receive_callback (line 119) | static size_t test_expansion_receive_callback(uint8_t* data, size_t data...
  function MU_TEST (line 131) | MU_TEST(test_expansion_encode_decode_frame) {
  function MU_TEST (line 173) | MU_TEST(test_expansion_garbage_input) {
  function MU_TEST_SUITE (line 190) | MU_TEST_SUITE(test_expansion_suite) {
  function run_minunit_test_expansion (line 197) | int run_minunit_test_expansion(void) {

FILE: applications/debug/unit_tests/tests/flipper_format/flipper_format_test.c
  function storage_write_string (line 87) | static bool storage_write_string(const char* path, const char* data) {
  function tests_setup (line 106) | static void tests_setup(void) {
  function tests_teardown (line 113) | static void tests_teardown(void) {
  function test_read (line 119) | static bool test_read(const char* file_name) {
  function test_read_updated (line 181) | static bool test_read_updated(const char* file_name) {
  function test_write (line 259) | static bool test_write(const char* file_name) {
  function test_delete_last_key (line 292) | static bool test_delete_last_key(const char* file_name) {
  function test_append_key (line 309) | static bool test_append_key(const char* file_name) {
  function test_update (line 327) | static bool test_update(const char* file_name) {
  function test_update_backward (line 361) | static bool test_update_backward(const char* file_name) {
  function test_write_multikey (line 392) | static bool test_write_multikey(const char* file_name) {
  function test_read_multikey (line 419) | static bool test_read_multikey(const char* file_name) {
  function MU_TEST (line 460) | MU_TEST(flipper_format_write_test) {
  function MU_TEST (line 467) | MU_TEST(flipper_format_read_test) {
  function MU_TEST (line 473) | MU_TEST(flipper_format_delete_test) {
  function MU_TEST (line 479) | MU_TEST(flipper_format_delete_result_test) {
  function MU_TEST (line 485) | MU_TEST(flipper_format_append_test) {
  function MU_TEST (line 491) | MU_TEST(flipper_format_append_result_test) {
  function MU_TEST (line 497) | MU_TEST(flipper_format_update_1_test) {
  function MU_TEST (line 503) | MU_TEST(flipper_format_update_1_result_test) {
  function MU_TEST (line 509) | MU_TEST(flipper_format_update_2_test) {
  function MU_TEST (line 515) | MU_TEST(flipper_format_update_2_result_test) {
  function MU_TEST (line 521) | MU_TEST(flipper_format_multikey_test) {
  function MU_TEST (line 526) | MU_TEST(flipper_format_oddities_test) {
  function MU_TEST_SUITE (line 532) | MU_TEST_SUITE(flipper_format) {
  function run_minunit_test_flipper_format (line 549) | int run_minunit_test_flipper_format(void) {

FILE: applications/debug/unit_tests/tests/flipper_format_string/flipper_format_string_test.c
  function MU_TEST (line 270) | MU_TEST(flipper_format_string_test) {
  function MU_TEST (line 298) | MU_TEST(flipper_format_file_test) {
  function MU_TEST_SUITE (line 330) | MU_TEST_SUITE(flipper_format_string_suite) {
  function run_minunit_test_flipper_format_string (line 335) | int run_minunit_test_flipper_format_string(void) {

FILE: applications/debug/unit_tests/tests/float_tools/float_tools_test.c
  function MU_TEST (line 6) | MU_TEST(float_tools_equal_test) {
  function MU_TEST_SUITE (line 53) | MU_TEST_SUITE(float_tools_suite) {
  function run_minunit_test_float_tools (line 57) | int run_minunit_test_float_tools(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_errno_test.c
  function errno_fuzzer (line 9) | static int32_t errno_fuzzer(void* context) {
  function test_errno_saving (line 36) | void test_errno_saving(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_event_loop_test.c
  type TestFuriEventLoopThread (line 15) | typedef struct {
  type TestFuriEventLoopData (line 24) | typedef struct {
  function test_furi_event_loop_pending_callback (line 34) | static void test_furi_event_loop_pending_callback(void* context) {
  function test_furi_event_loop_thread_init (line 48) | static void test_furi_event_loop_thread_init(TestFuriEventLoopThread* te...
  function test_furi_event_loop_thread_run_and_cleanup (line 53) | static void test_furi_event_loop_thread_run_and_cleanup(TestFuriEventLoo...
  function test_furi_event_loop_producer_message_queue_callback (line 60) | static void test_furi_event_loop_producer_message_queue_callback(
  function test_furi_event_loop_producer_stream_buffer_callback (line 99) | static void test_furi_event_loop_producer_stream_buffer_callback(
  function test_furi_event_loop_producer_event_flag_callback (line 142) | static void
  function test_furi_event_loop_producer_semaphore_callback (line 177) | static void
  function test_furi_event_loop_producer (line 212) | static int32_t test_furi_event_loop_producer(void* p) {
  function test_furi_event_loop_consumer_message_queue_callback (line 256) | static void test_furi_event_loop_consumer_message_queue_callback(
  function test_furi_event_loop_consumer_stream_buffer_callback (line 292) | static void test_furi_event_loop_consumer_stream_buffer_callback(
  function test_furi_event_loop_consumer_event_flag_callback (line 332) | static void
  function test_furi_event_loop_consumer_semaphore_callback (line 369) | static void
  function test_furi_event_loop_consumer (line 405) | static int32_t test_furi_event_loop_consumer(void* p) {
  type SelfUnsubTestTimerContext (line 449) | typedef struct {
  function test_self_unsub_semaphore_callback (line 455) | static void test_self_unsub_semaphore_callback(FuriEventLoopObject* obje...
  function test_self_unsub_timer_callback (line 459) | static void test_self_unsub_timer_callback(void* arg) {
  function test_furi_event_loop_self_unsubscribe (line 471) | void test_furi_event_loop_self_unsubscribe(void) {
  function test_furi_event_loop (line 498) | void test_furi_event_loop(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_memmgr_test.c
  function test_furi_memmgr (line 7) | void test_furi_memmgr(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_primitives_test.c
  type TestFuriPrimitivesData (line 10) | typedef struct {
  function test_furi_message_queue (line 15) | static void test_furi_message_queue(TestFuriPrimitivesData* data) {
  function test_furi_stream_buffer (line 52) | static void test_furi_stream_buffer(TestFuriPrimitivesData* data) {
  function test_furi_primitives (line 91) | void test_furi_primitives(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_pubsub_test.c
  function test_pubsub_handler (line 13) | void test_pubsub_handler(const void* arg, void* ctx) {
  function test_furi_pubsub (line 18) | void test_furi_pubsub(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_record_test.c
  function test_furi_create_open (line 6) | void test_furi_create_open(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_stdio_test.c
  function set_mock_in (line 15) | static void set_mock_in(const char* str) {
  function mock_in_cb (line 22) | static size_t mock_in_cb(char* buffer, size_t size, FuriWait wait, void*...
  function test_stdin (line 32) | void test_stdin(void) {
  function mock_out_cb (line 77) | static void mock_out_cb(const char* data, size_t size, void* context) {
  function assert_and_clear_mock_out (line 85) | static void assert_and_clear_mock_out(const char* expected) {
  function test_stdout (line 96) | void test_stdout(void) {

FILE: applications/debug/unit_tests/tests/furi/furi_test.c
  function test_setup (line 19) | void test_setup(void) {
  function test_teardown (line 23) | void test_teardown(void) {
  function MU_TEST (line 27) | MU_TEST(test_check) {
  function MU_TEST (line 32) | MU_TEST(mu_test_furi_create_open) {
  function MU_TEST (line 36) | MU_TEST(mu_test_furi_pubsub) {
  function MU_TEST (line 40) | MU_TEST(mu_test_furi_memmgr) {
  function MU_TEST (line 46) | MU_TEST(mu_test_furi_event_loop) {
  function MU_TEST (line 50) | MU_TEST(mu_test_furi_event_loop_self_unsubscribe) {
  function MU_TEST (line 54) | MU_TEST(mu_test_errno_saving) {
  function MU_TEST (line 58) | MU_TEST(mu_test_furi_primitives) {
  function MU_TEST (line 62) | MU_TEST(mu_test_stdio) {
  function MU_TEST_SUITE (line 67) | MU_TEST_SUITE(test_suite) {
  function run_minunit_test_furi (line 82) | int run_minunit_test_furi(void) {

FILE: applications/debug/unit_tests/tests/furi_hal/furi_hal_tests.c
  function furi_hal_i2c_int_setup (line 15) | static void furi_hal_i2c_int_setup(void) {
  function furi_hal_i2c_int_teardown (line 19) | static void furi_hal_i2c_int_teardown(void) {
  function furi_hal_i2c_ext_setup (line 23) | static void furi_hal_i2c_ext_setup(void) {
  function furi_hal_i2c_ext_teardown (line 27) | static void furi_hal_i2c_ext_teardown(void) {
  function MU_TEST (line 31) | MU_TEST(furi_hal_i2c_int_1b) {
  function MU_TEST (line 61) | MU_TEST(furi_hal_i2c_int_3b) {
  function MU_TEST (line 98) | MU_TEST(furi_hal_i2c_int_1b_fail) {
  function MU_TEST (line 122) | MU_TEST(furi_hal_i2c_int_ext_3b) {
  function MU_TEST (line 175) | MU_TEST(furi_hal_i2c_ext_eeprom) {
  function MU_TEST_SUITE (line 217) | MU_TEST_SUITE(furi_hal_i2c_int_suite) {
  function MU_TEST_SUITE (line 225) | MU_TEST_SUITE(furi_hal_i2c_ext_suite) {
  function run_minunit_test_furi_hal (line 230) | int run_minunit_test_furi_hal(void) {

FILE: applications/debug/unit_tests/tests/furi_hal_crypto/furi_hal_crypto_tests.c
  function furi_hal_crypto_ctr_setup (line 411) | static void furi_hal_crypto_ctr_setup(void) {
  function furi_hal_crypto_ctr_teardown (line 414) | static void furi_hal_crypto_ctr_teardown(void) {
  function furi_hal_crypto_gcm_setup (line 417) | static void furi_hal_crypto_gcm_setup(void) {
  function furi_hal_crypto_gcm_teardown (line 420) | static void furi_hal_crypto_gcm_teardown(void) {
  function MU_TEST (line 423) | MU_TEST(furi_hal_crypto_ctr_1) {
  function MU_TEST (line 432) | MU_TEST(furi_hal_crypto_ctr_2) {
  function MU_TEST (line 441) | MU_TEST(furi_hal_crypto_ctr_3) {
  function MU_TEST (line 450) | MU_TEST(furi_hal_crypto_ctr_4) {
  function MU_TEST (line 459) | MU_TEST(furi_hal_crypto_ctr_5) {
  function MU_TEST (line 468) | MU_TEST(furi_hal_crypto_gcm_1) {
  function MU_TEST (line 496) | MU_TEST(furi_hal_crypto_gcm_2) {
  function MU_TEST (line 524) | MU_TEST(furi_hal_crypto_gcm_3) {
  function MU_TEST (line 552) | MU_TEST(furi_hal_crypto_gcm_4) {
  function MU_TEST_SUITE (line 580) | MU_TEST_SUITE(furi_hal_crypto_ctr_test) {
  function MU_TEST_SUITE (line 589) | MU_TEST_SUITE(furi_hal_crypto_gcm_test) {
  function run_minunit_test_furi_hal_crypto (line 597) | int run_minunit_test_furi_hal_crypto(void) {

FILE: applications/debug/unit_tests/tests/furi_string/furi_string_test.c
  function test_setup (line 4) | static void test_setup(void) {
  function test_teardown (line 7) | static void test_teardown(void) {
  function FuriString (line 10) | static FuriString* furi_string_alloc_vprintf_test(const char format[], ....
  function MU_TEST (line 18) | MU_TEST(mu_test_furi_string_alloc_free) {
  function MU_TEST (line 67) | MU_TEST(mu_test_furi_string_mem) {
  function MU_TEST (line 109) | MU_TEST(mu_test_furi_string_getters) {
  function FuriString (line 123) | static FuriString* furi_string_vprintf_test(FuriString* string, const ch...
  function MU_TEST (line 131) | MU_TEST(mu_test_furi_string_setters) {
  function FuriString (line 171) | static FuriString* furi_string_cat_vprintf_test(FuriString* string, cons...
  function MU_TEST (line 179) | MU_TEST(mu_test_furi_string_appends) {
  function MU_TEST (line 214) | MU_TEST(mu_test_furi_string_compare) {
  function MU_TEST (line 265) | MU_TEST(mu_test_furi_string_search) {
  function MU_TEST (line 309) | MU_TEST(mu_test_furi_string_equality) {
  function MU_TEST (line 329) | MU_TEST(mu_test_furi_string_replace) {
  function MU_TEST (line 367) | MU_TEST(mu_test_furi_string_start_end) {
  function MU_TEST (line 393) | MU_TEST(mu_test_furi_string_trim) {
  function MU_TEST (line 419) | MU_TEST(mu_test_furi_string_utf8) {
  function MU_TEST_SUITE (line 448) | MU_TEST_SUITE(test_suite) {
  function run_minunit_test_furi_string (line 465) | int run_minunit_test_furi_string(void) {

FILE: applications/debug/unit_tests/tests/infrared/infrared_test.c
  type InfraredTest (line 12) | typedef struct {
  function infrared_test_alloc (line 22) | static void infrared_test_alloc(void) {
  function infrared_test_free (line 32) | static void infrared_test_free(void) {
  function infrared_test_prepare_file (line 44) | static bool infrared_test_prepare_file(const char* protocol_name) {
  function infrared_test_load_raw_signal (line 71) | static bool infrared_test_load_raw_signal(
  function infrared_test_read_message (line 103) | static bool infrared_test_read_message(FlipperFormat* ff, InfraredMessag...
  function infrared_test_load_messages (line 124) | static bool infrared_test_load_messages(
  function infrared_test_compare_message_results (line 164) | static void infrared_test_compare_message_results(
  function infrared_test_run_encoder_fill_array (line 180) | static void infrared_test_run_encoder_fill_array(
  function infrared_test_run_encoder (line 214) | static void infrared_test_run_encoder(InfraredProtocol protocol, uint32_...
  function infrared_test_run_encoder_decoder (line 269) | static void infrared_test_run_encoder_decoder(InfraredProtocol protocol,...
  function infrared_test_run_decoder (line 330) | static void infrared_test_run_decoder(InfraredProtocol protocol, uint32_...
  function MU_TEST (line 407) | MU_TEST(infrared_test_decoder_samsung32) {
  function MU_TEST (line 411) | MU_TEST(infrared_test_decoder_mixed) {
  function MU_TEST (line 436) | MU_TEST(infrared_test_decoder_nec) {
  function MU_TEST (line 442) | MU_TEST(infrared_test_decoder_unexpected_end_in_sequence) {
  function MU_TEST (line 449) | MU_TEST(infrared_test_decoder_necext1) {
  function MU_TEST (line 456) | MU_TEST(infrared_test_decoder_long_packets_with_nec_start) {
  function MU_TEST (line 462) | MU_TEST(infrared_test_encoder_sirc) {
  function MU_TEST (line 468) | MU_TEST(infrared_test_decoder_sirc) {
  function MU_TEST (line 474) | MU_TEST(infrared_test_decoder_rc5) {
  function MU_TEST (line 482) | MU_TEST(infrared_test_encoder_rc5x) {
  function MU_TEST (line 486) | MU_TEST(infrared_test_encoder_rc5) {
  function MU_TEST (line 490) | MU_TEST(infrared_test_decoder_rc6) {
  function MU_TEST (line 494) | MU_TEST(infrared_test_encoder_rc6) {
  function MU_TEST (line 498) | MU_TEST(infrared_test_decoder_kaseikyo) {
  function MU_TEST (line 504) | MU_TEST(infrared_test_decoder_rca) {
  function MU_TEST (line 510) | MU_TEST(infrared_test_decoder_pioneer) {
  function MU_TEST (line 516) | MU_TEST(infrared_test_encoder_decoder_all) {
  function MU_TEST (line 530) | MU_TEST(infrared_test_ac_database) {
  function MU_TEST (line 547) | MU_TEST(infrared_test_audio_database) {
  function MU_TEST (line 566) | MU_TEST(infrared_test_projector_database) {
  function MU_TEST (line 581) | MU_TEST(infrared_test_tv_database) {
  function MU_TEST_SUITE (line 598) | MU_TEST_SUITE(infrared_test) {
  function run_minunit_test_infrared (line 624) | int run_minunit_test_infrared(void) {

FILE: applications/debug/unit_tests/tests/js/js_test.c
  type JsTestFlag (line 17) | typedef enum {
  type JsTestCallbackContext (line 22) | typedef struct {
  function js_test_callback (line 27) | static void js_test_callback(JsThreadEvent event, const char* msg, void*...
  function js_test_run (line 39) | static void js_test_run(const char* script_path) {
  function MU_TEST (line 66) | MU_TEST(js_test_basic) {
  function MU_TEST (line 69) | MU_TEST(js_test_math) {
  function MU_TEST (line 72) | MU_TEST(js_test_event_loop) {
  function MU_TEST (line 75) | MU_TEST(js_test_storage) {
  function js_value_test_compatibility_matrix (line 79) | static void js_value_test_compatibility_matrix(struct mjs* mjs) {
  function js_value_test_literal (line 147) | static void js_value_test_literal(struct mjs* mjs) {
  function js_value_test_primitive (line 180) | static void js_value_test_primitive(
  function js_value_test_primitives (line 208) | static void js_value_test_primitives(struct mjs* mjs) {
  function js_value_test_enum (line 224) | static uint32_t
  function js_value_test_enums (line 235) | static void js_value_test_enums(struct mjs* mjs) {
  function js_value_test_object (line 262) | static void js_value_test_object(struct mjs* mjs) {
  function js_value_test_default (line 307) | static void js_value_test_default(struct mjs* mjs) {
  function js_value_test_args_fn (line 339) | static void js_value_test_args_fn(struct mjs* mjs) {
  function js_value_test_args (line 355) | static void js_value_test_args(struct mjs* mjs) {
  function MU_TEST (line 368) | MU_TEST(js_value_test) {
  function MU_TEST_SUITE (line 382) | MU_TEST_SUITE(test_js) {
  function run_minunit_test_js (line 390) | int run_minunit_test_js(void) {

FILE: applications/debug/unit_tests/tests/lfrfid/lfrfid_protocols.c
  function MU_TEST (line 226) | MU_TEST(test_lfrfid_protocol_em_read_simple) {
  function MU_TEST (line 269) | MU_TEST(test_lfrfid_protocol_em_emulate_simple) {
  function MU_TEST (line 293) | MU_TEST(test_lfrfid_protocol_h10301_read_simple) {
  function MU_TEST (line 337) | MU_TEST(test_lfrfid_protocol_h10301_emulate_simple) {
  function MU_TEST (line 364) | MU_TEST(test_lfrfid_protocol_ioprox_xsf_read_simple) {
  function MU_TEST (line 408) | MU_TEST(test_lfrfid_protocol_ioprox_xsf_emulate_simple) {
  function MU_TEST (line 435) | MU_TEST(test_lfrfid_protocol_inadala26_emulate_simple) {
  function MU_TEST (line 462) | MU_TEST(test_lfrfid_protocol_fdxb_emulate_simple) {
  function MU_TEST (line 486) | MU_TEST(test_lfrfid_protocol_fdxb_read_simple) {
  function MU_TEST_SUITE (line 529) | MU_TEST_SUITE(test_lfrfid_protocols_suite) {
  function run_minunit_test_lfrfid_protocols (line 545) | int run_minunit_test_lfrfid_protocols(void) {

FILE: applications/debug/unit_tests/tests/manifest/manifest.c
  function MU_TEST (line 7) | MU_TEST(manifest_type_test) {
  function MU_TEST (line 17) | MU_TEST(manifest_iteration_test) {
  function MU_TEST_SUITE (line 67) | MU_TEST_SUITE(manifest_suite) {
  function run_minunit_test_manifest (line 72) | int run_minunit_test_manifest(void) {

FILE: applications/debug/unit_tests/tests/minunit.h
  function mu_timer_real (line 520) | __attribute__((unused)) static double mu_timer_real(void) {
  function mu_timer_cpu (line 592) | __attribute__((unused)) static double mu_timer_cpu(void) {

FILE: applications/debug/unit_tests/tests/nfc/nfc_test.c
  type NfcTestMfClassicSendFrameTestState (line 38) | typedef enum {
  type NfcTestMfClassicSendFrameTest (line 46) | typedef struct {
  type NfcTestSlixPollerSetPasswordState (line 53) | typedef enum {
  type NfcTestSlixPollerSetPasswordContext (line 58) | typedef struct {
  type NfcTest (line 66) | typedef struct {
  function nfc_test_alloc (line 72) | static void nfc_test_alloc(void) {
  function nfc_test_free (line 77) | static void nfc_test_free(void) {
  function nfc_test_save_and_load (line 85) | static void nfc_test_save_and_load(NfcDevice* nfc_device_ref) {
  function iso14443_3a_file_test (line 105) | static void iso14443_3a_file_test(uint8_t uid_len) {
  function nfc_file_test_with_generator (line 121) | static void nfc_file_test_with_generator(NfcDataGeneratorType type) {
  function MU_TEST (line 130) | MU_TEST(iso14443_3a_4b_file_test) {
  function MU_TEST (line 134) | MU_TEST(iso14443_3a_7b_file_test) {
  function MU_TEST (line 138) | MU_TEST(mf_ultralight_file_test) {
  function MU_TEST (line 142) | MU_TEST(mf_ultralight_ev1_11_file_test) {
  function MU_TEST (line 146) | MU_TEST(mf_ultralight_ev1_h11_file_test) {
  function MU_TEST (line 150) | MU_TEST(mf_ultralight_ev1_21_file_test) {
  function MU_TEST (line 154) | MU_TEST(mf_ultralight_ev1_h21_file_test) {
  function MU_TEST (line 158) | MU_TEST(mf_ultralight_ntag_203_file_test) {
  function MU_TEST (line 162) | MU_TEST(mf_ultralight_ntag_213_file_test) {
  function MU_TEST (line 166) | MU_TEST(mf_ultralight_ntag_215_file_test) {
  function MU_TEST (line 170) | MU_TEST(mf_ultralight_ntag_216_file_test) {
  function MU_TEST (line 174) | MU_TEST(mf_ultralight_ntag_i2c_1k_file_test) {
  function MU_TEST (line 178) | MU_TEST(mf_ultralight_ntag_i2c_2k_file_test) {
  function MU_TEST (line 182) | MU_TEST(mf_ultralight_ntag_i2c_plus_1k_file_test) {
  function MU_TEST (line 186) | MU_TEST(mf_ultralight_ntag_i2c_plus_2k_file_test) {
  function MU_TEST (line 190) | MU_TEST(mf_classic_mini_file_test) {
  function MU_TEST (line 194) | MU_TEST(mf_classic_1k_4b_file_test) {
  function MU_TEST (line 198) | MU_TEST(mf_classic_1k_7b_file_test) {
  function MU_TEST (line 202) | MU_TEST(mf_classic_4k_4b_file_test) {
  function MU_TEST (line 206) | MU_TEST(mf_classic_4k_7b_file_test) {
  function MU_TEST (line 210) | MU_TEST(iso14443_3a_reader) {
  function mf_ultralight_reader_test (line 239) | static void mf_ultralight_reader_test(const char* path) {
  function MU_TEST (line 281) | MU_TEST(mf_ultralight_11_reader) {
  function MU_TEST (line 285) | MU_TEST(mf_ultralight_21_reader) {
  function MU_TEST (line 289) | MU_TEST(mf_ultralight_c_reader) {
  function MU_TEST (line 293) | MU_TEST(ntag_215_reader) {
  function MU_TEST (line 297) | MU_TEST(ntag_216_reader) {
  function MU_TEST (line 301) | MU_TEST(ntag_213_locked_reader) {
  function mf_ultralight_write (line 340) | static void mf_ultralight_write(void) {
  function mf_classic_reader (line 390) | static void mf_classic_reader(void) {
  function mf_classic_write (line 416) | static void mf_classic_write(void) {
  function mf_classic_value_block (line 444) | static void mf_classic_value_block(void) {
  function NfcCommand (line 483) | NfcCommand mf_classic_poller_send_frame_callback(NfcGenericEventEx event...
  function MU_TEST (line 549) | MU_TEST(mf_classic_send_frame_test) {
  function MU_TEST (line 586) | MU_TEST(mf_classic_dict_test) {
  function FelicaError (line 655) | static FelicaError
  function MU_TEST (line 682) | MU_TEST(felica_read) {
  function MU_TEST (line 692) | MU_TEST(felica_read_auth) {
  function MU_TEST (line 705) | MU_TEST(slix_file_with_capabilities_test) {
  function NfcCommand (line 724) | NfcCommand slix_poller_set_password_callback(NfcGenericEventEx event, vo...
  function slix_set_password_test (line 761) | static void slix_set_password_test(const char* file_path, SlixPassword p...
  function MU_TEST (line 813) | MU_TEST(slix_set_password_default_cap_correct_pass) {
  function MU_TEST (line 817) | MU_TEST(slix_set_password_default_cap_incorrect_pass) {
  function MU_TEST (line 821) | MU_TEST(slix_set_password_access_all_passwords_cap) {
  function MU_TEST_SUITE (line 826) | MU_TEST_SUITE(nfc) {
  function run_minunit_test_nfc (line 878) | int run_minunit_test_nfc(void) {

FILE: applications/debug/unit_tests/tests/notification/notes_test.c
  function frequency_assert (line 5) | void frequency_assert(const char* note_name, const NotificationMessage* ...
  function MU_TEST (line 12) | MU_TEST(notification_messages_notes_frequency_from_name_test) {
  function MU_TEST_SUITE (line 156) | MU_TEST_SUITE(notes_suite) {
  function run_minunit_test_notes (line 160) | int run_minunit_test_notes(void) {

FILE: applications/debug/unit_tests/tests/pipe/pipe_test.c
  function MU_TEST (line 9) | MU_TEST(pipe_test_trivial) {
  type TestFlag (line 53) | typedef enum {
  type AncillaryThreadContext (line 59) | typedef struct {
  function on_data_arrived (line 64) | static void on_data_arrived(PipeSide* pipe, void* context) {
  function on_space_freed (line 72) | static void on_space_freed(PipeSide* pipe, void* context) {
  function on_became_broken (line 78) | static void on_became_broken(PipeSide* pipe, void* context) {
  function ancillary_thread (line 85) | static int32_t ancillary_thread(void* context) {
  function MU_TEST (line 106) | MU_TEST(pipe_test_event_loop) {
  function MU_TEST_SUITE (line 132) | MU_TEST_SUITE(test_pipe) {
  function run_minunit_test_pipe (line 137) | int run_minunit_test_pipe(void) {

FILE: applications/debug/unit_tests/tests/power/power_test.c
  function power_test_deinit (line 5) | static void power_test_deinit(void) {
  function MU_TEST (line 10) | MU_TEST(test_power_charge_voltage_limit_exact) {
  function MU_TEST (line 23) | MU_TEST(test_power_charge_voltage_limit_floating_imprecision) {
  function MU_TEST (line 29) | MU_TEST(test_power_charge_voltage_limit_inexact) {
  function MU_TEST (line 41) | MU_TEST(test_power_charge_voltage_limit_invalid_clamped) {
  function MU_TEST_SUITE (line 59) | MU_TEST_SUITE(test_power_suite) {
  function run_minunit_test_power (line 67) | int run_minunit_test_power(void) {

FILE: applications/debug/unit_tests/tests/protocol_dict/protocol_dict_test.c
  type TestDictProtocols (line 5) | typedef enum {
  type Protocol0Data (line 14) | typedef struct {
  function protocol_0_free (line 26) | static void protocol_0_free(Protocol0Data* data) {
  function protocol_0_decoder_start (line 34) | static void protocol_0_decoder_start(Protocol0Data* data) {
  function protocol_0_decoder_feed (line 38) | static bool protocol_0_decoder_feed(Protocol0Data* data, bool level, uin...
  function protocol_0_encoder_start (line 47) | static bool protocol_0_encoder_start(Protocol0Data* data) {
  function LevelDuration (line 52) | static LevelDuration protocol_0_encoder_yield(Protocol0Data* data) {
  type Protocol1Data (line 59) | typedef struct {
  function protocol_1_free (line 71) | static void protocol_1_free(Protocol1Data* data) {
  function protocol_1_decoder_start (line 79) | static void protocol_1_decoder_start(Protocol1Data* data) {
  function protocol_1_decoder_feed (line 83) | static bool protocol_1_decoder_feed(Protocol1Data* data, bool level, uin...
  function protocol_1_encoder_start (line 92) | static bool protocol_1_encoder_start(Protocol1Data* data) {
  function LevelDuration (line 97) | static LevelDuration protocol_1_encoder_yield(Protocol1Data* data) {
  function MU_TEST (line 146) | MU_TEST(test_protocol_dict) {
  function MU_TEST_SUITE (line 215) | MU_TEST_SUITE(test_protocol_dict_suite) {
  function run_minunit_test_protocol_dict (line 219) | int run_minunit_test_protocol_dict(void) {

FILE: applications/debug/unit_tests/tests/rpc/rpc_test.c
  type RpcSessionContext (line 35) | typedef struct {
  function test_rpc_setup (line 82) | static void test_rpc_setup(void) {
  function test_rpc_setup_second_session (line 103) | static void test_rpc_setup_second_session(void) {
  function test_rpc_teardown (line 123) | static void test_rpc_teardown(void) {
  function test_rpc_teardown_second_session (line 139) | static void test_rpc_teardown_second_session(void) {
  function test_rpc_storage_clean_directory (line 153) | static void test_rpc_storage_clean_directory(Storage* fs_api, const char...
  function test_rpc_storage_create_file (line 161) | static void test_rpc_storage_create_file(Storage* fs_api, const char* pa...
  function test_rpc_storage_setup (line 177) | static void test_rpc_storage_setup(void) {
  function test_rpc_storage_teardown (line 191) | static void test_rpc_storage_teardown(void) {
  function test_rpc_session_close_callback (line 199) | static void test_rpc_session_close_callback(void* context) {
  function test_rpc_session_terminated_callback (line 206) | static void test_rpc_session_terminated_callback(void* context) {
  function test_rpc_print_message_list (line 213) | static void test_rpc_print_message_list(MsgList_t msg_list) {
  function PB_CommandStatus (line 226) | static PB_CommandStatus test_rpc_storage_get_file_error(File* file) {
  function output_bytes_callback (line 268) | static void output_bytes_callback(void* ctx, uint8_t* got_bytes, size_t ...
  function test_rpc_add_ping_to_list (line 277) | static void test_rpc_add_ping_to_list(MsgList_t msg_list, bool request, ...
  function test_rpc_fill_basic_message (line 286) | static void test_rpc_fill_basic_message(PB_Main* message, uint16_t tag, ...
  function test_rpc_create_storage_list_request (line 294) | static void test_rpc_create_storage_list_request(
  function test_rpc_create_simple_message (line 308) | static void test_rpc_create_simple_message(
  function test_rpc_add_read_or_write_to_list (line 353) | static void test_rpc_add_read_or_write_to_list(
  function test_rpc_encode_and_feed_one (line 391) | static void test_rpc_encode_and_feed_one(PB_Main* request, uint8_t sessi...
  function test_rpc_encode_and_feed (line 420) | static void test_rpc_encode_and_feed(MsgList_t msg_list, uint8_t session) {
  function test_rpc_compare_file (line 429) | static void
  function test_rpc_compare_messages (line 448) | static void test_rpc_compare_messages(PB_Main* result, PB_Main* expected) {
  function test_rpc_pb_stream_read (line 545) | static bool test_rpc_pb_stream_read(pb_istream_t* istream, pb_byte_t* bu...
  function test_rpc_storage_list_create_expected_list_root (line 557) | static void
  function test_rpc_system_storage_list_filter (line 589) | static bool test_rpc_system_storage_list_filter(
  function test_rpc_storage_list_create_expected_list (line 606) | static void test_rpc_storage_list_create_expected_list(
  function test_rpc_decode_and_compare (line 689) | static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uin...
  function test_rpc_free_msg_list (line 724) | static void test_rpc_free_msg_list(MsgList_t msg_list) {
  function test_rpc_storage_list_run (line 732) | static void test_rpc_storage_list_run(
  function MU_TEST (line 755) | MU_TEST(test_storage_list) {
  function MU_TEST (line 766) | MU_TEST(test_storage_list_md5) {
  function MU_TEST (line 777) | MU_TEST(test_storage_list_size) {
  function test_rpc_add_empty_to_list (line 784) | static void
  function test_rpc_add_read_to_list_by_reading_real_file (line 794) | static void test_rpc_add_read_to_list_by_reading_real_file(
  function test_storage_read_run (line 843) | static void test_storage_read_run(const char* path, uint32_t command_id) {
  function test_is_exists (line 857) | static bool test_is_exists(const char* path) {
  function test_create_dir (line 866) | static void test_create_dir(const char* path) {
  function test_create_file (line 875) | static void test_create_file(const char* path, size_t size) {
  function test_rpc_storage_info_run (line 898) | static void test_rpc_storage_info_run(const char* path, uint32_t command...
  function test_rpc_storage_stat_run (line 930) | static void test_rpc_storage_stat_run(const char* path, uint32_t command...
  function MU_TEST (line 964) | MU_TEST(test_storage_info) {
  function MU_TEST (line 972) | MU_TEST(test_storage_stat) {
  function MU_TEST (line 989) | MU_TEST(test_storage_read) {
  function test_storage_write_run (line 1003) | static void test_storage_write_run(
  function test_storage_write_read_run (line 1031) | static void test_storage_write_read_run(
  function MU_TEST (line 1067) | MU_TEST(test_storage_write_read) {
  function MU_TEST (line 1074) | MU_TEST(test_storage_write) {
  function MU_TEST (line 1095) | MU_TEST(test_storage_interrupt_continuous_same_system) {
  function MU_TEST (line 1141) | MU_TEST(test_storage_interrupt_continuous_another_system) {
  function test_storage_delete_run (line 1191) | static void test_storage_delete_run(
  function MU_TEST (line 1213) | MU_TEST(test_storage_delete_recursive) {
  function MU_TEST (line 1256) | MU_TEST(test_storage_delete) {
  function test_storage_mkdir_run (line 1276) | static void test_storage_mkdir_run(const char* path, size_t command_id, ...
  function MU_TEST (line 1291) | MU_TEST(test_storage_mkdir) {
  function test_storage_calculate_md5sum (line 1305) | static void test_storage_calculate_md5sum(const char* path, char* md5sum...
  function test_storage_md5sum_run (line 1323) | static void test_storage_md5sum_run(
  function MU_TEST (line 1349) | MU_TEST(test_storage_md5sum) {
  function test_rpc_storage_rename_run (line 1379) | static void test_rpc_storage_rename_run(
  function MU_TEST (line 1408) | MU_TEST(test_storage_rename) {
  function MU_TEST (line 1426) | MU_TEST(test_ping) {
  function MU_TEST (line 1455) | MU_TEST(test_system_protobuf_version) {
  function MU_TEST_SUITE (line 1481) | MU_TEST_SUITE(test_rpc_system) {
  function MU_TEST_SUITE (line 1488) | MU_TEST_SUITE(test_rpc_storage) {
  function test_app_create_request (line 1509) | static void test_app_create_request(
  function test_app_start_run (line 1535) | static void test_app_start_run(
  function test_app_get_status_lock_run (line 1554) | static void test_app_get_status_lock_run(bool locked_expected, uint32_t ...
  function MU_TEST (line 1578) | MU_TEST(test_app_start_and_lock_status) {
  function MU_TEST_SUITE (line 1614) | MU_TEST_SUITE(test_rpc_app) {
  function test_send_rubbish (line 1620) | static void
  function test_rpc_feed_rubbish_run (line 1633) | static void test_rpc_feed_rubbish_run(
  function MU_TEST (line 1667) | MU_TEST(test_rpc_feed_rubbish) {
  function MU_TEST (line 1731) | MU_TEST(test_rpc_multisession_ping) {
  function MU_TEST (line 1767) | MU_TEST(test_rpc_multisession_storage) {
  function MU_TEST_SUITE (line 1826) | MU_TEST_SUITE(test_rpc_session) {
  function run_minunit_test_rpc (line 1839) | int run_minunit_test_rpc(void) {
  function delay_test_app (line 1854) | int32_t delay_test_app(void* p) {

FILE: applications/debug/unit_tests/tests/storage/storage_test.c
  function storage_file_create (line 17) | static bool storage_file_create(Storage* storage, const char* path, cons...
  function storage_file_open_lock_setup (line 40) | static void storage_file_open_lock_setup(void) {
  function storage_file_open_lock_teardown (line 51) | static void storage_file_open_lock_teardown(void) {
  function storage_file_locker (line 57) | static int32_t storage_file_locker(void* ctx) {
  function MU_TEST (line 71) | MU_TEST(storage_file_open_lock) {
  function MU_TEST (line 100) | MU_TEST(storage_file_open_close) {
  function storage_file_read_write_test (line 119) | static bool storage_file_read_write_test(File* file, uint8_t* data, size...
  function MU_TEST (line 153) | MU_TEST(storage_file_read_write_64k) {
  function MU_TEST_SUITE (line 179) | MU_TEST_SUITE(storage_file) {
  function MU_TEST_SUITE (line 186) | MU_TEST_SUITE(storage_file_64k) {
  function MU_TEST (line 190) | MU_TEST(storage_dir_open_close) {
  function storage_dir_locker (line 208) | static int32_t storage_dir_locker(void* ctx) {
  function MU_TEST (line 222) | MU_TEST(storage_dir_open_lock) {
  function MU_TEST (line 251) | MU_TEST(storage_dir_exists_test) {
  function MU_TEST_SUITE (line 262) | MU_TEST_SUITE(storage_dir) {
  function write_file_13DA (line 287) | static bool write_file_13DA(Storage* storage, const char* path) {
  function check_file_13DA (line 299) | static bool check_file_13DA(Storage* storage, const char* path) {
  function storage_dir_create (line 315) | static void storage_dir_create(Storage* storage, const char* base) {
  function storage_dir_remove (line 334) | static void storage_dir_remove(Storage* storage, const char* base) {
  function storage_dir_rename_check (line 338) | static bool storage_dir_rename_check(Storage* storage, const char* base) {
  function MU_TEST (line 369) | MU_TEST(storage_file_rename) {
  function MU_TEST (line 394) | MU_TEST(storage_dir_rename) {
  function MU_TEST (line 415) | MU_TEST(storage_equiv_and_subdir) {
  function MU_TEST_SUITE (line 449) | MU_TEST_SUITE(storage_rename) {
  function storage_test_app (line 475) | static int32_t storage_test_app(void* arg) {
  function MU_TEST (line 484) | MU_TEST(test_storage_data_path_apps) {
  function MU_TEST (line 513) | MU_TEST(test_storage_data_path) {
  function MU_TEST (line 527) | MU_TEST(test_storage_common_migrate) {
  function MU_TEST (line 696) | MU_TEST(test_md5_calc) {
  function MU_TEST_SUITE (line 736) | MU_TEST_SUITE(test_data_path) {
  function MU_TEST_SUITE (line 741) | MU_TEST_SUITE(test_storage_common) {
  function MU_TEST_SUITE (line 745) | MU_TEST_SUITE(test_md5_calc_suite) {
  function run_minunit_test_storage (line 749) | int run_minunit_test_storage(void) {

FILE: applications/debug/unit_tests/tests/stream/stream_test.c
  function MU_TEST (line 299) | MU_TEST(stream_composite_test) {
  function MU_TEST (line 333) | MU_TEST(stream_write_read_save_load_test) {
  function MU_TEST (line 389) | MU_TEST(stream_split_test) {
  function MU_TEST (line 413) | MU_TEST(stream_buffered_write_after_read_test) {
  function MU_TEST (line 441) | MU_TEST(stream_buffered_large_file_test) {
  function MU_TEST_SUITE (line 520) | MU_TEST_SUITE(stream_suite) {
  function run_minunit_test_stream (line 528) | int run_minunit_test_stream(void) {

FILE: applications/debug/unit_tests/tests/strint/strint_test.c
  function MU_TEST (line 8) | MU_TEST(strint_test_basic) {
  function MU_TEST (line 14) | MU_TEST(strint_test_junk) {
  function MU_TEST (line 23) | MU_TEST(strint_test_tail) {
  function MU_TEST (line 35) | MU_TEST(strint_test_errors) {
  function MU_TEST (line 58) | MU_TEST(strint_test_bases) {
  function MU_TEST_SUITE (line 92) | MU_TEST_SUITE(strint_test_limits) {
  function MU_TEST_SUITE (line 128) | MU_TEST_SUITE(test_strint_suite) {
  function run_minunit_test_strint (line 137) | int run_minunit_test_strint(void) {

FILE: applications/debug/unit_tests/tests/subghz/subghz_test.c
  function subghz_test_rx_callback (line 29) | static void subghz_test_rx_callback(
  function subghz_test_init (line 44) | static void subghz_test_init(void) {
  function subghz_test_deinit (line 62) | static void subghz_test_deinit(void) {
  function subghz_decoder_test (line 68) | static bool subghz_decoder_test(const char* path, const char* name_decod...
  function subghz_decode_random_test (line 111) | static bool subghz_decode_random_test(const char* path) {
  function subghz_encoder_test (line 152) | static bool subghz_encoder_test(const char* path) {
  function MU_TEST (line 214) | MU_TEST(subghz_keystore_test) {
  type SubGhzHalAsyncTxTestType (line 220) | typedef enum {
  type SubGhzHalAsyncTxTest (line 230) | typedef struct {
  function LevelDuration (line 237) | static LevelDuration subghz_hal_async_tx_test_yield(void* context) {
  function subghz_hal_async_tx_test_run (line 322) | bool subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestType type) {
  function MU_TEST (line 350) | MU_TEST(subghz_hal_async_tx_test) {
  function MU_TEST (line 375) | MU_TEST(subghz_decoder_came_atomo_test) {
  function MU_TEST (line 382) | MU_TEST(subghz_decoder_came_test) {
  function MU_TEST (line 388) | MU_TEST(subghz_decoder_came_twee_test) {
  function MU_TEST (line 395) | MU_TEST(subghz_decoder_faac_slh_test) {
  function MU_TEST (line 402) | MU_TEST(subghz_decoder_gate_tx_test) {
  function MU_TEST (line 409) | MU_TEST(subghz_decoder_hormann_hsm_test) {
  function MU_TEST (line 416) | MU_TEST(subghz_decoder_ido_test) {
  function MU_TEST (line 423) | MU_TEST(subghz_decoder_keeloq_test) {
  function MU_TEST (line 430) | MU_TEST(subghz_decoder_kia_seed_test) {
  function MU_TEST (line 437) | MU_TEST(subghz_decoder_nero_radio_test) {
  function MU_TEST (line 444) | MU_TEST(subghz_decoder_nero_sketch_test) {
  function MU_TEST (line 451) | MU_TEST(subghz_decoder_nice_flo_test) {
  function MU_TEST (line 458) | MU_TEST(subghz_decoder_nice_flor_s_test) {
  function MU_TEST (line 465) | MU_TEST(subghz_decoder_princeton_test) {
  function MU_TEST (line 472) | MU_TEST(subghz_decoder_scher_khan_magic_code_test) {
  function MU_TEST (line 480) | MU_TEST(subghz_decoder_somfy_keytis_test) {
  function MU_TEST (line 487) | MU_TEST(subghz_decoder_somfy_telis_test) {
  function MU_TEST (line 494) | MU_TEST(subghz_decoder_star_line_test) {
  function MU_TEST (line 501) | MU_TEST(subghz_decoder_linear_test) {
  function MU_TEST (line 508) | MU_TEST(subghz_decoder_linear_delta3_test) {
  function MU_TEST (line 516) | MU_TEST(subghz_decoder_megacode_test) {
  function MU_TEST (line 523) | MU_TEST(subghz_decoder_secplus_v1_test) {
  function MU_TEST (line 531) | MU_TEST(subghz_decoder_secplus_v2_test) {
  function MU_TEST (line 539) | MU_TEST(subghz_decoder_holtek_test) {
  function MU_TEST (line 546) | MU_TEST(subghz_decoder_power_smart_test) {
  function MU_TEST (line 553) | MU_TEST(subghz_decoder_marantec_test) {
  function MU_TEST (line 560) | MU_TEST(subghz_decoder_bett_test) {
  function MU_TEST (line 566) | MU_TEST(subghz_decoder_doitrand_test) {
  function MU_TEST (line 573) | MU_TEST(subghz_decoder_phoenix_v2_test) {
  function MU_TEST (line 580) | MU_TEST(subghz_decoder_honeywell_wdb_test) {
  function MU_TEST (line 588) | MU_TEST(subghz_decoder_magellan_test) {
  function MU_TEST (line 595) | MU_TEST(subghz_decoder_intertechno_v3_test) {
  function MU_TEST (line 603) | MU_TEST(subghz_decoder_clemsa_test) {
  function MU_TEST (line 610) | MU_TEST(subghz_decoder_ansonic_test) {
  function MU_TEST (line 617) | MU_TEST(subghz_decoder_smc5326_test) {
  function MU_TEST (line 624) | MU_TEST(subghz_decoder_holtek_ht12x_test) {
  function MU_TEST (line 631) | MU_TEST(subghz_decoder_dooya_test) {
  function MU_TEST (line 638) | MU_TEST(subghz_decoder_alutech_at_4n_test) {
  function MU_TEST (line 646) | MU_TEST(subghz_decoder_nice_one_test) {
  function MU_TEST (line 653) | MU_TEST(subghz_decoder_kinggates_stylo4k_test) {
  function MU_TEST (line 661) | MU_TEST(subghz_decoder_mastercode_test) {
  function MU_TEST (line 668) | MU_TEST(subghz_decoder_dickert_test) {
  function MU_TEST (line 675) | MU_TEST(subghz_decoder_legrand_test) {
  function MU_TEST (line 682) | MU_TEST(subghz_decoder_marantec24_test) {
  function MU_TEST (line 689) | MU_TEST(subghz_decoder_roger_test) {
  function MU_TEST (line 696) | MU_TEST(subghz_decoder_feron_test) {
  function MU_TEST (line 703) | MU_TEST(subghz_decoder_gangqi_test) {
  function MU_TEST (line 710) | MU_TEST(subghz_decoder_hollarm_test) {
  function MU_TEST (line 717) | MU_TEST(subghz_decoder_reversrb2_test) {
  function MU_TEST (line 724) | MU_TEST(subghz_decoder_hay21_test) {
  function MU_TEST (line 732) | MU_TEST(subghz_encoder_princeton_test) {
  function MU_TEST (line 738) | MU_TEST(subghz_encoder_came_test) {
  function MU_TEST (line 744) | MU_TEST(subghz_encoder_came_twee_test) {
  function MU_TEST (line 750) | MU_TEST(subghz_encoder_gate_tx_test) {
  function MU_TEST (line 756) | MU_TEST(subghz_encoder_nice_flo_test) {
  function MU_TEST (line 762) | MU_TEST(subghz_encoder_keeloq_test) {
  function MU_TEST (line 768) | MU_TEST(subghz_encoder_linear_test) {
  function MU_TEST (line 774) | MU_TEST(subghz_encoder_linear_delta3_test) {
  function MU_TEST (line 780) | MU_TEST(subghz_encoder_megacode_test) {
  function MU_TEST (line 786) | MU_TEST(subghz_encoder_holtek_test) {
  function MU_TEST (line 792) | MU_TEST(subghz_encoder_secplus_v1_test) {
  function MU_TEST (line 798) | MU_TEST(subghz_encoder_secplus_v2_test) {
  function MU_TEST (line 804) | MU_TEST(subghz_encoder_power_smart_test) {
  function MU_TEST (line 810) | MU_TEST(subghz_encoder_marantec_test) {
  function MU_TEST (line 816) | MU_TEST(subghz_encoder_bett_test) {
  function MU_TEST (line 822) | MU_TEST(subghz_encoder_doitrand_test) {
  function MU_TEST (line 828) | MU_TEST(subghz_encoder_phoenix_v2_test) {
  function MU_TEST (line 834) | MU_TEST(subghz_encoder_honeywell_wdb_test) {
  function MU_TEST (line 840) | MU_TEST(subghz_encoder_magellan_test) {
  function MU_TEST (line 846) | MU_TEST(subghz_encoder_intertechno_v3_test) {
  function MU_TEST (line 852) | MU_TEST(subghz_encoder_clemsa_test) {
  function MU_TEST (line 858) | MU_TEST(subghz_encoder_ansonic_test) {
  function MU_TEST (line 864) | MU_TEST(subghz_encoder_smc5326_test) {
  function MU_TEST (line 870) | MU_TEST(subghz_encoder_holtek_ht12x_test) {
  function MU_TEST (line 876) | MU_TEST(subghz_encoder_dooya_test) {
  function MU_TEST (line 882) | MU_TEST(subghz_encoder_mastercode_test) {
  function MU_TEST (line 888) | MU_TEST(subghz_encoder_dickert_test) {
  function MU_TEST (line 894) | MU_TEST(subghz_encoder_legrand_test) {
  function MU_TEST (line 900) | MU_TEST(subghz_encoder_feron_test) {
  function MU_TEST (line 906) | MU_TEST(subghz_encoder_gangqi_test) {
  function MU_TEST (line 912) | MU_TEST(subghz_encoder_hollarm_test) {
  function MU_TEST (line 918) | MU_TEST(subghz_encoder_reversrb2_test) {
  function MU_TEST (line 924) | MU_TEST(subghz_encoder_roger_test) {
  function MU_TEST (line 930) | MU_TEST(subghz_encoder_marantec24_test) {
  function MU_TEST (line 936) | MU_TEST(subghz_random_test) {
  function MU_TEST_SUITE (line 940) | MU_TEST_SUITE(subghz) {
  function run_minunit_test_subghz (line 1036) | int run_minunit_test_subghz(void) {

FILE: applications/debug/unit_tests/tests/test_api.h
  type TestApi (line 8) | typedef struct {

FILE: applications/debug/unit_tests/tests/varint/varint_test.c
  function MU_TEST (line 9) | MU_TEST(test_varint_basic_u) {
  function MU_TEST (line 25) | MU_TEST(test_varint_basic_i) {
  function MU_TEST (line 56) | MU_TEST(test_varint_rand_u) {
  function MU_TEST (line 68) | MU_TEST(test_varint_rand_i) {
  function MU_TEST_SUITE (line 80) | MU_TEST_SUITE(test_varint_suite) {
  function run_minunit_test_varint (line 87) | int run_minunit_test_varint(void) {

FILE: applications/debug/unit_tests/unit_test_api_table_i.h
  type mjs (line 46) | struct mjs

FILE: applications/debug/unit_tests/unit_tests.c
  function unit_tests_cli (line 9) | void unit_tests_cli(PipeSide* pipe, FuriString* args, void* context) {
  function unit_tests_on_system_start (line 17) | void unit_tests_on_system_start(void) {

FILE: applications/debug/usb_mouse/usb_mouse.c
  type EventType (line 9) | typedef enum {
  type UsbMouseEvent (line 13) | typedef struct {
  function usb_mouse_render_callback (line 20) | static void usb_mouse_render_callback(Canvas* canvas, void* ctx) {
  function usb_mouse_input_callback (line 31) | static void usb_mouse_input_callback(InputEvent* input_event, void* ctx) {
  function usb_mouse_app (line 40) | int32_t usb_mouse_app(void* p) {

FILE: applications/debug/usb_test/usb_test.c
  type UsbTestApp (line 9) | typedef struct {
  type SubmenuIndex (line 16) | typedef enum {
  function usb_test_submenu_callback (line 27) | void usb_test_submenu_callback(void* context, uint32_t index) {
  function usb_test_exit (line 53) | uint32_t usb_test_exit(void* context) {
  function UsbTestApp (line 58) | UsbTestApp* usb_test_app_alloc(void) {
  function usb_test_app_free (line 99) | void usb_test_app_free(UsbTestApp* app) {
  function usb_test_app (line 115) | int32_t usb_test_app(void* p) {

FILE: applications/debug/vibro_test/vibro_test.c
  function vibro_test_draw_callback (line 8) | void vibro_test_draw_callback(Canvas* canvas, void* ctx) {
  function vibro_test_input_callback (line 19) | void vibro_test_input_callback(InputEvent* input_event, void* ctx) {
  function vibro_test_app (line 25) | int32_t vibro_test_app(void* p) {

FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext.c
  type SubGhzDeviceCC1101ExtState (line 43) | typedef enum {
  type SubGhzDeviceCC1101ExtRegulation (line 52) | typedef enum {
  type SubGhzDeviceCC1101ExtAsyncTxMiddlewareState (line 57) | typedef enum {
  type SubGhzDeviceCC1101ExtAsyncTxMiddleware (line 63) | typedef struct {
  type SubGhzDeviceCC1101ExtAsyncTx (line 69) | typedef struct {
  type SubGhzDeviceCC1101ExtAsyncRx (line 78) | typedef struct {
  type SubGhzDeviceCC1101Ext (line 84) | typedef struct {
  function subghz_device_cc1101_ext_check_init (line 96) | static bool subghz_device_cc1101_ext_check_init(void) {
  function subghz_device_cc1101_ext_alloc (line 209) | bool subghz_device_cc1101_ext_alloc(void) {
  function subghz_device_cc1101_ext_free (line 224) | void subghz_device_cc1101_ext_free(void) {
  function subghz_device_cc1101_ext_set_async_mirror_pin (line 231) | void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin) {
  function GpioPin (line 235) | const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void) {
  function subghz_device_cc1101_ext_is_connect (line 239) | bool subghz_device_cc1101_ext_is_connect(void) {
  function subghz_device_cc1101_ext_sleep (line 255) | void subghz_device_cc1101_ext_sleep(void) {
  function subghz_device_cc1101_ext_dump_state (line 270) | void subghz_device_cc1101_ext_dump_state(void) {
  function subghz_device_cc1101_ext_load_custom_preset (line 279) | void subghz_device_cc1101_ext_load_custom_preset(const uint8_t* preset_d...
  function subghz_device_cc1101_ext_load_registers (line 310) | void subghz_device_cc1101_ext_load_registers(const uint8_t* data) {
  function subghz_device_cc1101_ext_load_patable (line 321) | void subghz_device_cc1101_ext_load_patable(const uint8_t data[8]) {
  function subghz_device_cc1101_ext_write_packet (line 327) | void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t ...
  function subghz_device_cc1101_ext_flush_rx (line 335) | void subghz_device_cc1101_ext_flush_rx(void) {
  function subghz_device_cc1101_ext_flush_tx (line 341) | void subghz_device_cc1101_ext_flush_tx(void) {
  function subghz_device_cc1101_ext_rx_pipe_not_empty (line 347) | bool subghz_device_cc1101_ext_rx_pipe_not_empty(void) {
  function subghz_device_cc1101_ext_is_rx_data_crc_valid (line 362) | bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void) {
  function subghz_device_cc1101_ext_read_packet (line 375) | void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size) {
  function subghz_device_cc1101_ext_shutdown (line 381) | void subghz_device_cc1101_ext_shutdown(void) {
  function subghz_device_cc1101_ext_reset (line 388) | void subghz_device_cc1101_ext_reset(void) {
  function subghz_device_cc1101_ext_idle (line 402) | void subghz_device_cc1101_ext_idle(void) {
  function subghz_device_cc1101_ext_rx (line 414) | void subghz_device_cc1101_ext_rx(void) {
  function subghz_device_cc1101_ext_tx (line 427) | bool subghz_device_cc1101_ext_tx(void) {
  function subghz_device_cc1101_ext_get_rssi (line 440) | float subghz_device_cc1101_ext_get_rssi(void) {
  function subghz_device_cc1101_ext_get_lqi (line 455) | uint8_t subghz_device_cc1101_ext_get_lqi(void) {
  function subghz_device_cc1101_ext_is_frequency_valid (line 464) | bool subghz_device_cc1101_ext_is_frequency_valid(uint32_t value) {
  function subghz_device_cc1101_ext_set_frequency (line 474) | uint32_t subghz_device_cc1101_ext_set_frequency(uint32_t value) {
  function subghz_device_cc1101_ext_start_debug (line 495) | static bool subghz_device_cc1101_ext_start_debug(void) {
  function subghz_device_cc1101_ext_stop_debug (line 508) | static bool subghz_device_cc1101_ext_stop_debug(void) {
  function subghz_device_cc1101_ext_capture_ISR (line 518) | static void subghz_device_cc1101_ext_capture_ISR(void* context) {
  function subghz_device_cc1101_ext_start_async_rx (line 544) | void subghz_device_cc1101_ext_start_async_rx(
  function subghz_device_cc1101_ext_stop_async_rx (line 592) | void subghz_device_cc1101_ext_stop_async_rx(void) {
  function subghz_device_cc1101_ext_async_tx_middleware_idle (line 610) | void subghz_device_cc1101_ext_async_tx_middleware_idle(
  function subghz_device_cc1101_ext_async_tx_middleware_get_duration (line 617) | static inline uint32_t subghz_device_cc1101_ext_async_tx_middleware_get_...
  function subghz_device_cc1101_ext_async_tx_refill (line 668) | static void subghz_device_cc1101_ext_async_tx_refill(uint32_t* buffer, s...
  function subghz_device_cc1101_ext_async_tx_dma_isr (line 700) | static void subghz_device_cc1101_ext_async_tx_dma_isr(void* context) {
  function subghz_device_cc1101_ext_start_async_tx (line 723) | bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallba...
  function subghz_device_cc1101_ext_is_async_tx_complete (line 830) | bool subghz_device_cc1101_ext_is_async_tx_complete(void) {
  function subghz_device_cc1101_ext_stop_async_tx (line 835) | void subghz_device_cc1101_ext_stop_async_tx(void) {

FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext.h
  type LevelDuration (line 183) | typedef LevelDuration (*SubGhzDeviceCC1101ExtCallback)(void* context);

FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c
  function subghz_device_cc1101_ext_interconnect_is_frequency_valid (line 7) | static bool subghz_device_cc1101_ext_interconnect_is_frequency_valid(uin...
  function subghz_device_cc1101_ext_interconnect_set_frequency (line 15) | static uint32_t subghz_device_cc1101_ext_interconnect_set_frequency(uint...
  function subghz_device_cc1101_ext_interconnect_start_async_tx (line 20) | static bool subghz_device_cc1101_ext_interconnect_start_async_tx(void* c...
  function subghz_device_cc1101_ext_interconnect_start_async_rx (line 25) | static void subghz_device_cc1101_ext_interconnect_start_async_rx(void* c...
  function subghz_device_cc1101_ext_interconnect_load_preset (line 30) | static void subghz_device_cc1101_ext_interconnect_load_preset(
  function FlipperAppPluginDescriptor (line 108) | const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void) {

FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h
  type SubGhzDeviceCC1101Ext (line 6) | typedef struct SubGhzDeviceCC1101Ext SubGhzDeviceCC1101Ext;

FILE: applications/examples/example_adc/example_adc.c
  type DataItem (line 51) | typedef struct {
  type Data (line 58) | typedef struct {
  function app_draw_callback (line 67) | static void app_draw_callback(Canvas* canvas, void* ctx) {
  function app_input_callback (line 92) | static void app_input_callback(InputEvent* input_event, void* ctx) {
  function example_adc_main (line 98) | int32_t example_adc_main(void* p) {

FILE: applications/examples/example_apps_assets/example_apps_assets.c
  function example_apps_data_print_file_content (line 13) | static void example_apps_data_print_file_content(Storage* storage, const...
  function example_apps_assets_main (line 36) | int32_t example_apps_assets_main(void* p) {

FILE: applications/examples/example_apps_data/example_apps_data.c
  function example_apps_data_main (line 12) | int32_t example_apps_data_main(void* p) {

FILE: applications/examples/example_ble_beacon/ble_beacon_app.c
  function ble_beacon_app_custom_event_callback (line 10) | static bool ble_beacon_app_custom_event_callback(void* context, uint32_t...
  function ble_beacon_app_back_event_callback (line 16) | static bool ble_beacon_app_back_event_callback(void* context) {
  function ble_beacon_app_tick_event_callback (line 22) | static void ble_beacon_app_tick_event_callback(void* context) {
  function ble_beacon_app_restore_beacon_state (line 28) | static void ble_beacon_app_restore_beacon_state(BleBeaconApp* app) {
  function BleBeaconApp (line 60) | static BleBeaconApp* ble_beacon_app_alloc(void) {
  function ble_beacon_app_free (line 96) | static void ble_beacon_app_free(BleBeaconApp* app) {
  function ble_beacon_app (line 117) | int32_t ble_beacon_app(void* args) {
  function ble_beacon_app_update_state (line 130) | void ble_beacon_app_update_state(BleBeaconApp* app) {

FILE: applications/examples/example_ble_beacon/ble_beacon_app.h
  type BleBeaconApp (line 27) | typedef struct {
  type BleBeaconAppView (line 44) | typedef enum {
  type BleBeaconAppCustomEvent (line 50) | typedef enum {

FILE: applications/examples/example_ble_beacon/scenes/scene_input_beacon_data.c
  function ble_beacon_app_scene_add_type_byte_input_callback (line 3) | static void ble_beacon_app_scene_add_type_byte_input_callback(void* cont...
  function ble_beacon_app_scene_input_beacon_data_on_enter (line 9) | void ble_beacon_app_scene_input_beacon_data_on_enter(void* context) {
  function ble_beacon_app_scene_input_beacon_data_on_event (line 24) | bool ble_beacon_app_scene_input_beacon_data_on_event(void* context, Scen...
  function ble_beacon_app_scene_input_beacon_data_on_exit (line 39) | void ble_beacon_app_scene_input_beacon_data_on_exit(void* context) {

FILE: applications/examples/example_ble_beacon/scenes/scene_input_mac_addr.c
  function ble_beacon_app_scene_add_type_byte_input_callback (line 3) | static void ble_beacon_app_scene_add_type_byte_input_callback(void* cont...
  function ble_beacon_app_scene_input_mac_addr_on_enter (line 9) | void ble_beacon_app_scene_input_mac_addr_on_enter(void* context) {
  function ble_beacon_app_scene_input_mac_addr_on_event (line 24) | bool ble_beacon_app_scene_input_mac_addr_on_event(void* context, SceneMa...
  function ble_beacon_app_scene_input_mac_addr_on_exit (line 39) | void ble_beacon_app_scene_input_mac_addr_on_exit(void* context) {

FILE: applications/examples/example_ble_beacon/scenes/scene_menu.c
  type SubmenuIndex (line 3) | enum SubmenuIndex {
  function ble_beacon_app_scene_menu_submenu_callback (line 8) | static void ble_beacon_app_scene_menu_submenu_callback(void* context, ui...
  function ble_beacon_app_scene_menu_on_enter (line 13) | void ble_beacon_app_scene_menu_on_enter(void* context) {
  function ble_beacon_app_scene_menu_on_event (line 33) | bool ble_beacon_app_scene_menu_on_event(void* context, SceneManagerEvent...
  function ble_beacon_app_scene_menu_on_exit (line 53) | void ble_beacon_app_scene_menu_on_exit(void* context) {

FILE: applications/examples/example_ble_beacon/scenes/scene_run_beacon.c
  function ble_beacon_app_scene_run_beacon_confirm_dialog_callback (line 4) | static void
  function update_status_text (line 11) | static void update_status_text(BleBeaconApp* ble_beacon) {
  function ble_beacon_app_scene_run_beacon_on_enter (line 50) | void ble_beacon_app_scene_run_beacon_on_enter(void* context) {
  function ble_beacon_app_scene_run_beacon_on_event (line 58) | bool ble_beacon_app_scene_run_beacon_on_event(void* context, SceneManage...
  function ble_beacon_app_scene_run_beacon_on_exit (line 76) | void ble_beacon_app_scene_run_beacon_on_exit(void* context) {

FILE: applications/examples/example_ble_beacon/scenes/scenes.h
  type BleBeaconAppScene (line 7) | typedef enum {

FILE: applications/examples/example_custom_font/example_custom_font.c
  function app_draw_callback (line 72) | static void app_draw_callback(Canvas* canvas, void* ctx) {
  function app_input_callback (line 84) | static void app_input_callback(InputEvent* input_event, void* ctx) {
  function example_custom_font_main (line 91) | int32_t example_custom_font_main(void* p) {

FILE: applications/examples/example_event_loop/example_event_loop_event_flags.c
  type EventLoopEventFlagsApp (line 17) | typedef struct {
  type EventLoopEventFlags (line 24) | typedef enum {
  function event_loop_event_flags_app_input_callback (line 40) | static void event_loop_event_flags_app_input_callback(InputEvent* event,...
  function event_loop_event_flags_app_event_flags_callback (line 67) | static void
  function EventLoopEventFlagsApp (line 102) | static EventLoopEventFlagsApp* event_loop_event_flags_app_alloc(void) {
  function event_loop_event_flags_app_free (line 128) | static void event_loop_event_flags_app_free(EventLoopEventFlagsApp* app) {
  function event_loop_event_flags_app_run (line 151) | static void event_loop_event_flags_app_run(EventLoopEventFlagsApp* app) {
  function example_event_loop_event_flags_app (line 165) | int32_t example_event_loop_event_flags_app(void* arg) {

FILE: applications/examples/example_event_loop/example_event_loop_multi.c
  type EventLoopMultiAppWorker (line 33) | typedef struct {
  type EventLoopMultiApp (line 39) | typedef struct {
  function event_loop_multi_app_stream_buffer_worker_callback (line 55) | static void
  function event_loop_multi_app_worker_timer_callback (line 69) | static void event_loop_multi_app_worker_timer_callback(void* context) {
  function EventLoopMultiAppWorker (line 82) | static EventLoopMultiAppWorker*
  function event_loop_multi_app_worker_free (line 108) | static void event_loop_multi_app_worker_free(EventLoopMultiAppWorker* wo...
  function event_loop_multi_app_worker_run (line 121) | static void event_loop_multi_app_worker_run(EventLoopMultiAppWorker* wor...
  function event_loop_multi_app_worker_thread (line 127) | static int32_t event_loop_multi_app_worker_thread(void* context) {
  function event_loop_multi_app_input_callback (line 145) | static void event_loop_multi_app_input_callback(InputEvent* event, void*...
  function event_loop_multi_app_stream_buffer_callback (line 153) | static void
  function event_loop_multi_app_input_queue_callback (line 176) | static void event_loop_multi_app_input_queue_callback(FuriEventLoopObjec...
  function event_loop_multi_app_exit_timer_callback (line 224) | static void event_loop_multi_app_exit_timer_callback(void* context) {
  function EventLoopMultiApp (line 246) | static EventLoopMultiApp* event_loop_multi_app_alloc(void) {
  function event_loop_multi_app_free (line 290) | static void event_loop_multi_app_free(EventLoopMultiApp* app) {
  function event_loop_multi_app_run (line 310) | static void event_loop_multi_app_run(EventLoopMultiApp* app) {
  function example_event_loop_multi_app (line 328) | int32_t example_event_loop_multi_app(void* arg) {

FILE: applications/examples/example_event_loop/example_event_loop_mutex.c
  type EventLoopMutexApp (line 22) | typedef struct {
  function event_loop_mutex_app_worker_thread (line 30) | static int32_t event_loop_mutex_app_worker_thread(void* context) {
  function event_loop_mutex_app_event_callback (line 62) | static void event_loop_mutex_app_event_callback(FuriEventLoopObject* obj...
  function EventLoopMutexApp (line 87) | static EventLoopMutexApp* event_loop_mutex_app_alloc(void) {
  function event_loop_mutex_app_free (line 111) | static void event_loop_mutex_app_free(EventLoopMutexApp* app) {
  function event_loop_mutex_app_run (line 123) | static void event_loop_mutex_app_run(EventLoopMutexApp* app) {
  function example_event_loop_mutex_app (line 130) | int32_t example_event_loop_mutex_app(void* arg) {

FILE: applications/examples/example_event_loop/example_event_loop_stream_buffer.c
  type EventLoopStreamBufferApp (line 22) | typedef struct {
  function event_loop_stream_buffer_app_worker_thread (line 29) | static int32_t event_loop_stream_buffer_app_worker_thread(void* context) {
  function event_loop_stream_buffer_app_event_callback (line 57) | static void
  function EventLoopStreamBufferApp (line 81) | static EventLoopStreamBufferApp* event_loop_stream_buffer_app_alloc(void) {
  function event_loop_stream_buffer_app_free (line 102) | static void event_loop_stream_buffer_app_free(EventLoopStreamBufferApp* ...
  function event_loop_stream_buffer_app_run (line 114) | static void event_loop_stream_buffer_app_run(EventLoopStreamBufferApp* a...
  function example_event_loop_stream_buffer_app (line 121) | int32_t example_event_loop_stream_buffer_app(void* arg) {

FILE: applications/examples/example_event_loop/example_event_loop_timer.c
  type EventLoopTimerApp (line 17) | typedef struct {
  function event_loop_timer_callback (line 24) | static void event_loop_timer_callback(void* context) {
  function EventLoopTimerApp (line 43) | static EventLoopTimerApp* event_loop_timer_app_alloc(void) {
  function event_loop_timer_app_free (line 59) | static void event_loop_timer_app_free(EventLoopTimerApp* app) {
  function event_loop_timer_app_run (line 68) | static void event_loop_timer_app_run(EventLoopTimerApp* app) {
  function example_event_loop_timer_app (line 79) | int32_t example_event_loop_timer_app(void* arg) {

FILE: applications/examples/example_images/example_images.c
  type ImagePosition (line 15) | typedef struct {
  function app_draw_callback (line 22) | static void app_draw_callback(Canvas* canvas, void* ctx) {
  function app_input_callback (line 29) | static void app_input_callback(InputEvent* input_event, void* ctx) {
  function example_images_main (line 36) | int32_t example_images_main(void* p) {

FILE: applications/examples/example_number_input/example_number_input.c
  function example_number_input_custom_event_callback (line 3) | bool example_number_input_custom_event_callback(void* context, uint32_t ...
  function example_number_input_back_event_callback (line 9) | static bool example_number_input_back_event_callback(void* context) {
  function ExampleNumberInput (line 15) | static ExampleNumberInput* example_number_input_alloc() {
  function example_number_input_free (line 47) | static void example_number_input_free(ExampleNumberInput* app) {
  function example_number_input (line 66) | int32_t example_number_input(void* p) {

FILE: applications/examples/example_number_input/example_number_input.h
  type ExampleNumberInputShowNumber (line 17) | typedef struct ExampleNumberInputShowNumber ExampleNumberInputShowNumber;
  type ExampleNumberInputViewId (line 19) | typedef enum {
  type ExampleNumberInput (line 24) | typedef struct {

FILE: applications/examples/example_number_input/scenes/example_number_input_scene.h
  type ExampleNumberInputScene (line 7) | typedef enum {

FILE: applications/examples/example_number_input/scenes/example_number_input_scene_input_max.c
  function example_number_input_scene_input_max_callback (line 3) | void example_number_input_scene_input_max_callback(void* context, int32_...
  function example_number_input_scene_input_max_on_enter (line 9) | void example_number_input_scene_input_max_on_enter(void* context) {
  function example_number_input_scene_input_max_on_event (line 26) | bool example_number_input_scene_input_max_on_event(void* context, SceneM...
  function example_number_input_scene_input_max_on_exit (line 37) | void example_number_input_scene_input_max_on_exit(void* context) {

FILE: applications/examples/example_number_input/scenes/example_number_input_scene_input_min.c
  function example_number_input_scene_input_min_callback (line 3) | void example_number_input_scene_input_min_callback(void* context, int32_...
  function example_number_input_scene_input_min_on_enter (line 9) | void example_number_input_scene_input_min_on_enter(void* context) {
  function example_number_input_scene_input_min_on_event (line 26) | bool example_number_input_scene_input_min_on_event(void* context, SceneM...
  function example_number_input_scene_input_min_on_exit (line 37) | void example_number_input_scene_input_min_on_exit(void* context) {

FILE: applications/examples/example_number_input/scenes/example_number_input_scene_input_number.c
  function example_number_input_scene_input_number_callback (line 3) | void example_number_input_scene_input_number_callback(void* context, int...
  function example_number_input_scene_input_number_on_enter (line 9) | void example_number_input_scene_input_number_on_enter(void* context) {
  function example_number_input_scene_input_number_on_event (line 29) | bool example_number_input_scene_input_number_on_event(void* context, Sce...
  function example_number_input_scene_input_number_on_exit (line 40) | void example_number_input_scene_input_number_on_exit(void* context) {

FILE: applications/examples/example_number_input/scenes/example_number_input_scene_show_number.c
  function example_number_input_scene_confirm_dialog_callback (line 3) | static void
  function example_number_input_scene_update_view (line 10) | static void example_number_input_scene_update_view(void* context) {
  function example_number_input_scene_show_number_on_enter (line 28) | void example_number_input_scene_show_number_on_enter(void* context) {
  function example_number_input_scene_show_number_on_event (line 37) | bool example_number_input_scene_show_number_on_event(void* context, Scen...
  function example_number_input_scene_show_number_on_exit (line 63) | void example_number_input_scene_show_number_on_exit(void* context) {

FILE: applications/examples/example_plugins/example_plugins.c
  function example_plugins_app (line 18) | int32_t example_plugins_app(void* p) {

FILE: applications/examples/example_plugins/example_plugins_multi.c
  function example_plugins_multi_app (line 18) | int32_t example_plugins_multi_app(void* p) {

FILE: applications/examples/example_plugins/plugin1.c
  function example_plugin1_method1 (line 12) | static int example_plugin1_method1(void) {
  function example_plugin1_method2 (line 16) | static int example_plugin1_method2(int arg1, int arg2) {
  function FlipperAppPluginDescriptor (line 35) | const FlipperAppPluginDescriptor* example_plugin1_ep(void) {

FILE: applications/examples/example_plugins/plugin2.c
  function example_plugin2_method1 (line 12) | static int example_plugin2_method1(void) {
  function example_plugin2_method2 (line 16) | static int example_plugin2_method2(int arg1, int arg2) {
  function FlipperAppPluginDescriptor (line 35) | const FlipperAppPluginDescriptor* example_plugin2_ep(void) {

FILE: applications/examples/example_plugins/plugin_interface.h
  type ExamplePlugin (line 12) | typedef struct {

FILE: applications/examples/example_plugins_advanced/app_api.c
  function app_api_accumulator_set (line 7) | void app_api_accumulator_set(uint32_t value) {
  function app_api_accumulator_get (line 11) | uint32_t app_api_accumulator_get(void) {
  function app_api_accumulator_add (line 15) | void app_api_accumulator_add(uint32_t value) {
  function app_api_accumulator_sub (line 19) | void app_api_accumulator_sub(uint32_t value) {
  function app_api_accumulator_mul (line 23) | void app_api_accumulator_mul(uint32_t value) {

FILE: applications/examples/example_plugins_advanced/example_advanced_plugins.c
  function example_advanced_plugins_app (line 13) | int32_t example_advanced_plugins_app(void* p) {

FILE: applications/examples/example_plugins_advanced/plugin1.c
  function advanced_plugin1_method1 (line 16) | static void advanced_plugin1_method1(int arg1) {
  function advanced_plugin1_method2 (line 21) | static void advanced_plugin1_method2(void) {
  function FlipperAppPluginDescriptor (line 41) | const FlipperAppPluginDescriptor* advanced_plugin1_ep(void) {

FILE: applications/examples/example_plugins_advanced/plugin2.c
  function advanced_plugin2_method1 (line 16) | static void advanced_plugin2_method1(int arg1) {
  function advanced_plugin2_method2 (line 21) | static void advanced_plugin2_method2(void) {
  function FlipperAppPluginDescriptor (line 41) | const FlipperAppPluginDescriptor* advanced_plugin2_ep(void) {

FILE: applications/examples/example_plugins_advanced/plugin_interface.h
  type AdvancedPlugin (line 12) | typedef struct {

FILE: applications/examples/example_thermo/example_thermo.c
  type ReaderThreadFlag (line 55) | typedef enum {
  type DS18B20Scratchpad (line 59) | typedef union {
  type ExampleThermoContext (line 73) | typedef struct {
  function example_thermo_request_temperature (line 87) | static void example_thermo_request_temperature(ExampleThermoContext* con...
  function example_thermo_read_temperature (line 116) | static void example_thermo_read_temperature(ExampleThermoContext* contex...
  function example_thermo_reader_thread_callback (line 194) | static int32_t example_thermo_reader_thread_callback(void* ctx) {
  function example_thermo_draw_callback (line 218) | static void example_thermo_draw_callback(Canvas* canvas, void* ctx) {
  function example_thermo_input_callback (line 269) | static void example_thermo_input_callback(InputEvent* event, void* ctx) {
  function example_thermo_run (line 275) | static void example_thermo_run(ExampleThermoContext* context) {
  function ExampleThermoContext (line 319) | static ExampleThermoContext* example_thermo_context_alloc(void) {
  function example_thermo_context_free (line 344) | static void example_thermo_context_free(ExampleThermoContext* context) {
  function example_thermo_main (line 358) | int32_t example_thermo_main(void* p) {

FILE: applications/examples/example_view_dispatcher/example_view_dispatcher.c
  type ViewIndex (line 22) | typedef enum {
  type SubmenuIndex (line 29) | typedef enum {
  type ExampleViewDispatcherApp (line 35) | typedef struct {
  function example_view_dispatcher_app_navigation_callback (line 42) | static bool example_view_dispatcher_app_navigation_callback(void* contex...
  function example_view_dispatcher_app_custom_event_callback (line 51) | static bool example_view_dispatcher_app_custom_event_callback(void* cont...
  function example_view_dispatcher_app_button_callback (line 64) | static void example_view_dispatcher_app_button_callback(
  function example_view_dispatcher_app_submenu_callback (line 78) | static void example_view_dispatcher_app_submenu_callback(void* context, ...
  function ExampleViewDispatcherApp (line 89) | static ExampleViewDispatcherApp* example_view_dispatcher_app_alloc() {
  function example_view_dispatcher_app_free (line 136) | static void example_view_dispatcher_app_free(ExampleViewDispatcherApp* a...
  function example_view_dispatcher_app_run (line 152) | static void example_view_dispatcher_app_run(ExampleViewDispatcherApp* ap...
  function example_view_dispatcher_app (line 165) | int32_t example_view_dispatcher_app(void* arg) {

FILE: applications/examples/example_view_holder/example_view_holder.c
  function example_view_holder_back_callback (line 16) | static void example_view_holder_back_callback(void* context) {
  function example_view_holder_app (line 22) | int32_t example_view_holder_app(void* arg) {

FILE: applications/main/archive/archive.c
  function archive_custom_event_callback (line 3) | bool archive_custom_event_callback(void* context, uint32_t event) {
  function archive_back_event_callback (line 9) | bool archive_back_event_callback(void* context) {
  function ArchiveApp (line 15) | ArchiveApp* archive_alloc(void) {
  function archive_free (line 50) | void archive_free(ArchiveApp* archive) {
  function archive_app (line 72) | int32_t archive_app(void* p) {

FILE: applications/main/archive/archive.h
  type ArchiveApp (line 3) | typedef struct ArchiveApp ArchiveApp;

FILE: applications/main/archive/archive_i.h
  type ArchiveViewEnum (line 16) | typedef enum {
  type ArchiveApp (line 23) | struct ArchiveApp {

FILE: applications/main/archive/helpers/archive_apps.c
  function ArchiveAppTypeEnum (line 9) | ArchiveAppTypeEnum archive_get_app_type(const char* path) {
  function archive_app_is_available (line 24) | bool archive_app_is_available(void* context, const char* path) {
  function archive_app_read_dir (line 47) | bool archive_app_read_dir(void* context, const char* path) {
  function archive_app_delete_file (line 67) | void archive_app_delete_file(void* context, const char* path) {

FILE: applications/main/archive/helpers/archive_apps.h
  type ArchiveAppTypeEnum (line 5) | typedef enum {
  function ArchiveFileTypeEnum (line 18) | static inline ArchiveFileTypeEnum archive_get_app_filetype(ArchiveAppTyp...

FILE: applications/main/archive/helpers/archive_browser.c
  function archive_folder_open_cb (line 11) | static void
  function archive_list_load_cb (line 44) | static void archive_list_load_cb(void* context, uint32_t list_load_offse...
  function archive_list_item_cb (line 58) | static void
  function archive_long_load_cb (line 83) | static void archive_long_load_cb(void* context) {
  function archive_file_browser_set_path (line 91) | static void archive_file_browser_set_path(
  function archive_is_item_in_array (line 114) | bool archive_is_item_in_array(ArchiveBrowserViewModel* model, uint32_t i...
  function archive_is_file_list_load_required (line 125) | bool archive_is_file_list_load_required(ArchiveBrowserViewModel* model) {
  function archive_update_offset (line 145) | void archive_update_offset(ArchiveBrowserView* browser) {
  function archive_update_focus (line 167) | void archive_update_focus(ArchiveBrowserView* browser, const char* targe...
  function archive_file_get_array_size (line 196) | size_t archive_file_get_array_size(ArchiveBrowserView* browser) {
  function archive_set_item_count (line 208) | void archive_set_item_count(ArchiveBrowserView* browser, uint32_t count) {
  function archive_file_array_rm_selected (line 222) | void archive_file_array_rm_selected(ArchiveBrowserView* browser) {
  function archive_file_array_swap (line 247) | void archive_file_array_swap(ArchiveBrowserView* browser, int8_t dir) {
  function archive_file_array_rm_all (line 275) | void archive_file_array_rm_all(ArchiveBrowserView* browser) {
  function archive_file_array_load (line 285) | void archive_file_array_load(ArchiveBrowserView* browser, int8_t dir) {
  function ArchiveFile_t (line 314) | ArchiveFile_t* archive_get_current_file(ArchiveBrowserView* browser) {
  function ArchiveFile_t (line 330) | ArchiveFile_t* archive_get_file_at(ArchiveBrowserView* browser, size_t i...
  function ArchiveTabEnum (line 346) | ArchiveTabEnum archive_get_tab(ArchiveBrowserView* browser) {
  function archive_is_home (line 355) | bool archive_is_home(ArchiveBrowserView* browser) {
  function archive_set_tab (line 371) | void archive_set_tab(ArchiveBrowserView* browser, ArchiveTabEnum tab) {
  function archive_add_app_item (line 378) | void archive_add_app_item(ArchiveBrowserView* browser, const char* name) {
  function archive_get_fap_meta (line 398) | static bool archive_get_fap_meta(FuriString* file_path, FuriString* fap_...
  function archive_add_file_item (line 408) | void archive_add_file_item(ArchiveBrowserView* browser, bool is_folder, ...
  function archive_show_file_menu (line 432) | void archive_show_file_menu(ArchiveBrowserView* browser, bool show) {
  function archive_favorites_move_mode (line 455) | void archive_favorites_move_mode(ArchiveBrowserView* browser, bool activ...
  function archive_is_dir_exists (line 462) | static bool archive_is_dir_exists(FuriString* path) {
  function archive_switch_tab (line 476) | void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) {
  function archive_enter_dir (line 532) | void archive_enter_dir(ArchiveBrowserView* browser, FuriString* path) {
  function archive_leave_dir (line 546) | void archive_leave_dir(ArchiveBrowserView* browser) {
  function archive_refresh_dir (line 555) | void archive_refresh_dir(ArchiveBrowserView* browser) {

FILE: applications/main/archive/helpers/archive_browser.h
  function ArchiveFileTypeEnum (line 53) | static inline ArchiveFileTypeEnum archive_get_tab_filetype(ArchiveTabEnu...
  function archive_is_known_app (line 65) | inline bool archive_is_known_app(ArchiveFileTypeEnum type) {

FILE: applications/main/archive/helpers/archive_favorites.c
  function archive_favorites_read_line (line 10) | static bool archive_favorites_read_line(File* file, FuriString* str_resu...
  function archive_favorites_count (line 50) | uint16_t archive_favorites_count(void* context) {
  function archive_favourites_rescan (line 83) | static bool archive_favourites_rescan(void) {
  function archive_favorites_read (line 126) | bool archive_favorites_read(void* context) {
  function archive_favorites_delete (line 188) | bool archive_favorites_delete(const char* format, ...) {
  function archive_is_favorite (line 231) | bool archive_is_favorite(const char* format, ...) {
  function archive_favorites_rename (line 270) | bool archive_favorites_rename(const char* src, const char* dst) {
  function archive_add_to_favorites (line 316) | void archive_add_to_favorites(const char* file_path) {
  function archive_favorites_save (line 322) | void archive_favorites_save(void* context) {
  function archive_favorites_handle_setting_pin_unpin (line 342) | void archive_favorites_handle_setting_pin_unpin(const char* app_name, co...

FILE: applications/main/archive/helpers/archive_files.c
  function archive_set_file_type (line 9) | void archive_set_file_type(ArchiveFile_t* file, const char* path, bool i...
  function archive_get_items (line 40) | bool archive_get_items(void* context, const char* path) {
  function archive_file_append (line 54) | void archive_file_append(const char* path, const char* format, ...) {
  function archive_delete_file (line 78) | void archive_delete_file(void* context, const char* format, ...) {

FILE: applications/main/archive/helpers/archive_files.h
  type ArchiveFileTypeEnum (line 9) | typedef enum {
  type ArchiveFile_t (line 27) | typedef struct {
  function ArchiveFile_t_init (line 36) | static void ArchiveFile_t_init(ArchiveFile_t* obj) {
  function ArchiveFile_t_init_set (line 45) | static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile...
  function ArchiveFile_t_set (line 59) | static void ArchiveFile_t_set(ArchiveFile_t* obj, const ArchiveFile_t* s...
  function ArchiveFile_t_clear (line 73) | static void ArchiveFile_t_clear(ArchiveFile_t* obj) {

FILE: applications/main/archive/scenes/archive_scene.h
  type ArchiveAppScene (line 7) | typedef enum {

FILE: applications/main/archive/scenes/archive_scene_browser.c
  function archive_loader_callback (line 39) | static void archive_loader_callback(const void* message, void* context) {
  function archive_run_in_app (line 51) | static void archive_run_in_app(ArchiveBrowserView* browser, ArchiveFile_...
  function archive_scene_browser_callback (line 91) | void archive_scene_browser_callback(ArchiveBrowserEvent event, void* con...
  function archive_scene_browser_on_enter (line 96) | void archive_scene_browser_on_enter(void* context) {
  function archive_scene_browser_on_event (line 119) | bool archive_scene_browser_on_event(void* context, SceneManagerEvent eve...
  function archive_scene_browser_on_exit (line 248) | void archive_scene_browser_on_exit(void* context) {

FILE: applications/main/archive/scenes/archive_scene_delete.c
  function archive_scene_delete_widget_callback (line 10) | void archive_scene_delete_widget_callback(GuiButtonType result, InputTyp...
  function archive_scene_delete_on_enter (line 18) | void archive_scene_delete_on_enter(void* context) {
  function archive_scene_delete_on_event (line 49) | bool archive_scene_delete_on_event(void* context, SceneManagerEvent even...
  function archive_scene_delete_on_exit (line 73) | void archive_scene_delete_on_exit(void* context) {

FILE: applications/main/archive/scenes/archive_scene_rename.c
  function archive_scene_rename_text_input_callback (line 11) | void archive_scene_rename_text_input_callback(void* context) {
  function archive_scene_rename_on_enter (line 16) | void archive_scene_rename_on_enter(void* context) {
  function archive_scene_rename_on_event (line 53) | bool archive_scene_rename_on_event(void* context, SceneManagerEvent even...
  function archive_scene_rename_on_exit (line 87) | void archive_scene_rename_on_exit(void* context) {

FILE: applications/main/archive/views/archive_browser_view.c
  function archive_browser_set_callback (line 41) | void archive_browser_set_callback(
  function render_item_menu (line 51) | static void render_item_menu(Canvas* canvas, ArchiveBrowserViewModel* mo...
  function archive_draw_frame (line 90) | static void archive_draw_frame(Canvas* canvas, uint16_t idx, bool scroll...
  function archive_draw_loading (line 111) | static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel...
  function draw_list (line 120) | static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) {
  function archive_render_status_bar (line 197) | static void archive_render_status_bar(Canvas* canvas, ArchiveBrowserView...
  function archive_view_render (line 233) | static void archive_view_render(Canvas* canvas, void* mdl) {
  function View (line 248) | View* archive_browser_get_view(ArchiveBrowserView* browser) {
  function file_list_rollover (line 253) | static void file_list_rollover(ArchiveBrowserViewModel* model) {
  function archive_view_input (line 259) | static bool archive_view_input(InputEvent* event, void* context) {
  function browser_scroll_timer (line 418) | static void browser_scroll_timer(void* context) {
  function browser_view_enter (line 425) | static void browser_view_enter(void* context) {
  function browser_view_exit (line 433) | static void browser_view_exit(void* context) {
  function ArchiveBrowserView (line 439) | ArchiveBrowserView* browser_alloc(void) {
  function browser_free (line 465) | void browser_free(ArchiveBrowserView* browser) {

FILE: applications/main/archive/views/archive_browser_view.h
  type ArchiveTabEnum (line 21) | typedef enum {
  type ArchiveBrowserEvent (line 35) | typedef enum {
  type ArchiveBrowserView (line 66) | typedef struct ArchiveBrowserView ArchiveBrowserView;
  type BrowserActionEnum (line 70) | typedef enum {
  type ArchiveBrowserView (line 76) | struct ArchiveBrowserView {
  type ArchiveBrowserViewModel (line 88) | typedef struct {

FILE: applications/main/bad_usb/bad_usb_app.c
  function bad_usb_app_custom_event_callback (line 13) | static bool bad_usb_app_custom_event_callback(void* context, uint32_t ev...
  function bad_usb_app_back_event_callback (line 19) | static bool bad_usb_app_back_event_callback(void* context) {
  function bad_usb_app_tick_event_callback (line 25) | static void bad_usb_app_tick_event_callback(void* context) {
  function bad_usb_load_settings (line 31) | static void bad_usb_load_settings(BadUsbApp* app) {
  function bad_usb_save_settings (line 77) | static void bad_usb_save_settings(BadUsbApp* app) {
  function bad_usb_set_interface (line 97) | void bad_usb_set_interface(BadUsbApp* app, BadUsbHidInterface interface) {
  function BadUsbApp (line 102) | BadUsbApp* bad_usb_app_alloc(char* arg) {
  function bad_usb_app_free (line 170) | void bad_usb_app_free(BadUsbApp* app) {
  function bad_usb_app (line 215) | int32_t bad_usb_app(void* p) {

FILE: applications/main/bad_usb/bad_usb_app.h
  type BadUsbApp (line 7) | typedef struct BadUsbApp BadUsbApp;

FILE: applications/main/bad_usb/bad_usb_app_i.h
  type BadUsbAppError (line 25) | typedef enum {
  type BadUsbApp (line 30) | struct BadUsbApp {
  type BadUsbAppView (line 50) | typedef enum {

FILE: applications/main/bad_usb/helpers/bad_usb_hid.c
  function hid_usb_deinit (line 15) | void hid_usb_deinit(void* inst) {
  function hid_usb_set_state_callback (line 20) | void hid_usb_set_state_callback(void* inst, HidStateCallback cb, void* c...
  function hid_usb_is_connected (line 25) | bool hid_usb_is_connected(void* inst) {
  function hid_usb_kb_press (line 30) | bool hid_usb_kb_press(void* inst, uint16_t button) {
  function hid_usb_kb_release (line 35) | bool hid_usb_kb_release(void* inst, uint16_t button) {
  function hid_usb_mouse_press (line 40) | bool hid_usb_mouse_press(void* inst, uint8_t button) {
  function hid_usb_mouse_release (line 45) | bool hid_usb_mouse_release(void* inst, uint8_t button) {
  function hid_usb_mouse_scroll (line 50) | bool hid_usb_mouse_scroll(void* inst, int8_t delta) {
  function hid_usb_mouse_move (line 55) | bool hid_usb_mouse_move(void* inst, int8_t dx, int8_t dy) {
  function hid_usb_mouse_release_all (line 60) | bool hid_usb_mouse_release_all(void* inst) {
  function hid_usb_consumer_press (line 65) | bool hid_usb_consumer_press(void* inst, uint16_t button) {
  function hid_usb_consumer_release (line 70) | bool hid_usb_consumer_release(void* inst, uint16_t button) {
  function hid_usb_release_all (line 75) | bool hid_usb_release_all(void* inst) {
  function hid_usb_get_led_state (line 83) | uint8_t hid_usb_get_led_state(void* inst) {
  type BleHidInstance (line 106) | typedef struct {
  function hid_ble_connection_status_callback (line 119) | static void hid_ble_connection_status_callback(BtStatus status, void* co...
  function hid_ble_deinit (line 149) | void hid_ble_deinit(void* inst) {
  function hid_ble_set_state_callback (line 165) | void hid_ble_set_state_callback(void* inst, HidStateCallback cb, void* c...
  function hid_ble_is_connected (line 172) | bool hid_ble_is_connected(void* inst) {
  function hid_ble_kb_press (line 178) | bool hid_ble_kb_press(void* inst, uint16_t button) {
  function hid_ble_kb_release (line 184) | bool hid_ble_kb_release(void* inst, uint16_t button) {
  function hid_ble_mouse_press (line 190) | bool hid_ble_mouse_press(void* inst, uint8_t button) {
  function hid_ble_mouse_release (line 195) | bool hid_ble_mouse_release(void* inst, uint8_t button) {
  function hid_ble_mouse_scroll (line 200) | bool hid_ble_mouse_scroll(void* inst, int8_t delta) {
  function hid_ble_mouse_move (line 205) | bool hid_ble_mouse_move(void* inst, int8_t dx, int8_t dy) {
  function hid_ble_consumer_press (line 211) | bool hid_ble_consumer_press(void* inst, uint16_t button) {
  function hid_ble_consumer_release (line 217) | bool hid_ble_consumer_release(void* inst, uint16_t button) {
  function hid_ble_release_all (line 223) | bool hid_ble_release_all(void* inst) {
  function hid_ble_get_led_state (line 232) | uint8_t hid_ble_get_led_state(void* inst) {
  function BadUsbHidApi (line 256) | const BadUsbHidApi* bad_usb_hid_get_interface(BadUsbHidInterface interfa...
  function bad_usb_hid_ble_remove_pairing (line 264) | void bad_usb_hid_ble_remove_pairing(void) {

FILE: applications/main/bad_usb/helpers/bad_usb_hid.h
  type BadUsbHidInterface (line 10) | typedef enum {
  type BadUsbHidApi (line 15) | typedef struct {

FILE: applications/main/bad_usb/helpers/ducky_script.c
  type WorkerEvtFlags (line 19) | typedef enum {
  function ducky_get_command_len (line 42) | uint32_t ducky_get_command_len(const char* line) {
  function ducky_is_line_end (line 47) | bool ducky_is_line_end(const char chr) {
  function ducky_get_keycode (line 51) | uint16_t ducky_get_keycode(BadUsbScript* bad_usb, const char* param, boo...
  function ducky_get_number (line 70) | bool ducky_get_number(const char* param, uint32_t* val) {
  function ducky_numlock_on (line 79) | void ducky_numlock_on(BadUsbScript* bad_usb) {
  function ducky_numpad_press (line 86) | bool ducky_numpad_press(BadUsbScript* bad_usb, const char num) {
  function ducky_altchar (line 96) | bool ducky_altchar(BadUsbScript* bad_usb, const char* charcode) {
  function ducky_altstring (line 112) | bool ducky_altstring(BadUsbScript* bad_usb, const char* param) {
  function ducky_error (line 132) | int32_t ducky_error(BadUsbScript* bad_usb, const char* text, ...) {
  function ducky_string (line 142) | bool ducky_string(BadUsbScript* bad_usb, const char* param) {
  function ducky_string_next (line 162) | static bool ducky_string_next(BadUsbScript* bad_usb) {
  function ducky_parse_line (line 185) | static int32_t ducky_parse_line(BadUsbScript* bad_usb, FuriString* line) {
  function ducky_set_usb_id (line 230) | static bool ducky_set_usb_id(BadUsbScript* bad_usb, const char* line) {
  function bad_usb_hid_state_callback (line 255) | static void bad_usb_hid_state_callback(bool state, void* context) {
  function ducky_script_preload (line 266) | static bool ducky_script_preload(BadUsbScript* bad_usb, File* script_fil...
  function ducky_script_execute_next (line 312) | static int32_t ducky_script_execute_next(BadUsbScript* bad_usb, File* sc...
  function bad_usb_flags_get (line 381) | static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) {
  function bad_usb_worker (line 394) | static int32_t bad_usb_worker(void* context) {
  function bad_usb_script_set_default_keyboard_layout (line 666) | static void bad_usb_script_set_default_keyboard_layout(BadUsbScript* bad...
  function BadUsbScript (line 672) | BadUsbScript* bad_usb_script_open(FuriString* file_path, BadUsbHidInterf...
  function bad_usb_script_close (line 689) | void bad_usb_script_close(BadUsbScript* bad_usb) {
  function bad_usb_script_set_keyboard_layout (line 698) | void bad_usb_script_set_keyboard_layout(BadUsbScript* bad_usb, FuriStrin...
  function bad_usb_script_start_stop (line 722) | void bad_usb_script_start_stop(BadUsbScript* bad_usb) {
  function bad_usb_script_pause_resume (line 727) | void bad_usb_script_pause_resume(BadUsbScript* bad_usb) {
  function BadUsbState (line 732) | BadUsbState* bad_usb_script_get_state(BadUsbScript* bad_usb) {

FILE: applications/main/bad_usb/helpers/ducky_script.h
  type BadUsbWorkerState (line 11) | typedef enum {
  type BadUsbState (line 26) | typedef struct {
  type BadUsbScript (line 35) | typedef struct BadUsbScript BadUsbScript;

FILE: applications/main/bad_usb/helpers/ducky_script_commands.c
  type DuckyCmd (line 8) | typedef struct {
  function ducky_fnc_delay (line 14) | static int32_t ducky_fnc_delay(BadUsbScript* bad_usb, const char* line, ...
  function ducky_fnc_defdelay (line 27) | static int32_t ducky_fnc_defdelay(BadUsbScript* bad_usb, const char* lin...
  function ducky_fnc_strdelay (line 38) | static int32_t ducky_fnc_strdelay(BadUsbScript* bad_usb, const char* lin...
  function ducky_fnc_defstrdelay (line 49) | static int32_t ducky_fnc_defstrdelay(BadUsbScript* bad_usb, const char* ...
  function ducky_fnc_string (line 60) | static int32_t ducky_fnc_string(BadUsbScript* bad_usb, const char* line,...
  function ducky_fnc_repeat (line 80) | static int32_t ducky_fnc_repeat(BadUsbScript* bad_usb, const char* line,...
  function ducky_fnc_sysrq (line 91) | static int32_t ducky_fnc_sysrq(BadUsbScript* bad_usb, const char* line, ...
  function ducky_fnc_altchar (line 102) | static int32_t ducky_fnc_altchar(BadUsbScript* bad_usb, const char* line...
  function ducky_fnc_altstring (line 114) | static int32_t ducky_fnc_altstring(BadUsbScript* bad_usb, const char* li...
  function ducky_fnc_hold (line 126) | static int32_t ducky_fnc_hold(BadUsbScript* bad_usb, const char* line, i...
  function ducky_fnc_release (line 154) | static int32_t ducky_fnc_release(BadUsbScript* bad_usb, const char* line...
  function ducky_fnc_media (line 182) | static int32_t ducky_fnc_media(BadUsbScript* bad_usb, const char* line, ...
  function ducky_fnc_globe (line 195) | static int32_t ducky_fnc_globe(BadUsbScript* bad_usb, const char* line, ...
  function ducky_fnc_waitforbutton (line 211) | static int32_t ducky_fnc_waitforbutton(BadUsbScript* bad_usb, const char...
  function ducky_fnc_mouse_scroll (line 219) | static int32_t ducky_fnc_mouse_scroll(BadUsbScript* bad_usb, const char*...
  function ducky_fnc_mouse_move (line 234) | static int32_t ducky_fnc_mouse_move(BadUsbScript* bad_usb, const char* l...
  function ducky_execute_cmd (line 288) | int32_t ducky_execute_cmd(BadUsbScript* bad_usb, const char* line) {

FILE: applications/main/bad_usb/helpers/ducky_script_i.h
  type BadUsbScript (line 24) | struct BadUsbScript {

FILE: applications/main/bad_usb/helpers/ducky_script_keycodes.c
  type DuckyKey (line 4) | typedef struct {
  function ducky_get_next_modifier_keycode_by_name (line 117) | uint16_t ducky_get_next_modifier_keycode_by_name(const char** param) {
  function ducky_get_modifier_keycode_by_name (line 134) | uint16_t ducky_get_modifier_keycode_by_name(const char* param) {
  function ducky_get_keycode_by_name (line 146) | uint16_t ducky_get_keycode_by_name(const char* param) {
  function ducky_get_media_keycode_by_name (line 158) | uint16_t ducky_get_media_keycode_by_name(const char* param) {
  function ducky_get_mouse_keycode_by_name (line 170) | uint8_t ducky_get_mouse_keycode_by_name(const char* param) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene.h
  type BadUsbScene (line 7) | typedef enum {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_config.c
  type SubmenuIndex (line 3) | enum SubmenuIndex {
  function bad_usb_scene_config_select_callback (line 8) | void bad_usb_scene_config_select_callback(void* context, uint32_t index) {
  function draw_menu (line 14) | static void draw_menu(BadUsbApp* bad_usb) {
  function bad_usb_scene_config_on_enter (line 24) | void bad_usb_scene_config_on_enter(void* context) {
  function bad_usb_scene_config_on_event (line 36) | bool bad_usb_scene_config_on_event(void* context, SceneManagerEvent even...
  function bad_usb_scene_config_on_exit (line 54) | void bad_usb_scene_config_on_exit(void* context) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_config_layout.c
  function bad_usb_layout_select (line 4) | static bool bad_usb_layout_select(BadUsbApp* bad_usb) {
  function bad_usb_scene_config_layout_on_enter (line 29) | void bad_usb_scene_config_layout_on_enter(void* context) {
  function bad_usb_scene_config_layout_on_event (line 39) | bool bad_usb_scene_config_layout_on_event(void* context, SceneManagerEve...
  function bad_usb_scene_config_layout_on_exit (line 46) | void bad_usb_scene_config_layout_on_exit(void* context) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_confirm_unpair.c
  function bad_usb_scene_confirm_unpair_widget_callback (line 3) | void bad_usb_scene_confirm_unpair_widget_callback(
  function bad_usb_scene_confirm_unpair_on_enter (line 12) | void bad_usb_scene_confirm_unpair_on_enter(void* context) {
  function bad_usb_scene_confirm_unpair_on_event (line 31) | bool bad_usb_scene_confirm_unpair_on_event(void* context, SceneManagerEv...
  function bad_usb_scene_confirm_unpair_on_exit (line 48) | void bad_usb_scene_confirm_unpair_on_exit(void* context) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_error.c
  type BadUsbCustomEvent (line 3) | typedef enum {
  function bad_usb_scene_error_event_callback (line 7) | static void
  function bad_usb_scene_error_on_enter (line 17) | void bad_usb_scene_error_on_enter(void* context) {
  function bad_usb_scene_error_on_event (line 49) | bool bad_usb_scene_error_on_event(void* context, SceneManagerEvent event) {
  function bad_usb_scene_error_on_exit (line 62) | void bad_usb_scene_error_on_exit(void* context) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_file_select.c
  function bad_usb_file_select (line 5) | static bool bad_usb_file_select(BadUsbApp* bad_usb) {
  function bad_usb_scene_file_select_on_enter (line 21) | void bad_usb_scene_file_select_on_enter(void* context) {
  function bad_usb_scene_file_select_on_event (line 36) | bool bad_usb_scene_file_select_on_event(void* context, SceneManagerEvent...
  function bad_usb_scene_file_select_on_exit (line 43) | void bad_usb_scene_file_select_on_exit(void* context) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_unpair_done.c
  function bad_usb_scene_unpair_done_popup_callback (line 3) | static void bad_usb_scene_unpair_done_popup_callback(void* context) {
  function bad_usb_scene_unpair_done_on_enter (line 8) | void bad_usb_scene_unpair_done_on_enter(void* context) {
  function bad_usb_scene_unpair_done_on_event (line 24) | bool bad_usb_scene_unpair_done_on_event(void* context, SceneManagerEvent...
  function bad_usb_scene_unpair_done_on_exit (line 33) | void bad_usb_scene_unpair_done_on_exit(void* context) {

FILE: applications/main/bad_usb/scenes/bad_usb_scene_work.c
  function bad_usb_scene_work_button_callback (line 7) | void bad_usb_scene_work_button_callback(InputKey key, void* context) {
  function bad_usb_scene_work_on_event (line 13) | bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) {
  function bad_usb_scene_work_on_enter (line 52) | void bad_usb_scene_work_on_enter(void* context) {
  function bad_usb_scene_work_on_exit (line 78) | void bad_usb_scene_work_on_exit(void* context) {

FILE: applications/main/bad_usb/views/bad_usb_view.c
  type BadUsb (line 9) | struct BadUsb {
  type BadUsbModel (line 15) | typedef struct {
  function bad_usb_draw_callback (line 24) | static void bad_usb_draw_callback(Canvas* canvas, void* _model) {
  function bad_usb_input_callback (line 171) | static bool bad_usb_input_callback(InputEvent* event, void* context) {
  function BadUsb (line 207) | BadUsb* bad_usb_view_alloc(void) {
  function bad_usb_view_free (line 219) | void bad_usb_view_free(BadUsb* bad_usb) {
  function View (line 225) | View* bad_usb_view_get_view(BadUsb* bad_usb) {
  function bad_usb_view_set_button_callback (line 230) | void bad_usb_view_set_button_callback(
  function bad_usb_view_set_file_name (line 247) | void bad_usb_view_set_file_name(BadUsb* bad_usb, const char* name) {
  function bad_usb_view_set_layout (line 256) | void bad_usb_view_set_layout(BadUsb* bad_usb, const char* layout) {
  function bad_usb_view_set_state (line 265) | void bad_usb_view_set_state(BadUsb* bad_usb, BadUsbState* st) {
  function bad_usb_view_set_interface (line 280) | void bad_usb_view_set_interface(BadUsb* bad_usb, BadUsbHidInterface inte...
  function bad_usb_view_is_idle_state (line 284) | bool bad_usb_view_is_idle_state(BadUsb* bad_usb) {

FILE: applications/main/bad_usb/views/bad_usb_view.h
  type BadUsb (line 6) | typedef struct BadUsb BadUsb;

FILE: applications/main/gpio/gpio_app.c
  function gpio_app_custom_event_callback (line 6) | static bool gpio_app_custom_event_callback(void* context, uint32_t event) {
  function gpio_app_back_event_callback (line 12) | static bool gpio_app_back_event_callback(void* context) {
  function gpio_app_tick_event_callback (line 18) | static void gpio_app_tick_event_callback(void* context) {
  function GpioApp (line 24) | GpioApp* gpio_app_alloc(void) {
  function gpio_app_free (line 82) | void gpio_app_free(GpioApp* app) {
  function gpio_app (line 114) | int32_t gpio_app(void* p) {

FILE: applications/main/gpio/gpio_app.h
  type GpioApp (line 7) | typedef struct GpioApp GpioApp;

FILE: applications/main/gpio/gpio_app_i.h
  type GpioApp (line 23) | struct GpioApp {
  type GpioAppView (line 42) | typedef enum {

FILE: applications/main/gpio/gpio_custom_event.h
  type GpioCustomEvent (line 3) | typedef enum {

FILE: applications/main/gpio/gpio_items.c
  type GPIOItems (line 5) | struct GPIOItems {
  function GPIOItems (line 10) | GPIOItems* gpio_items_alloc(void) {
  function gpio_items_free (line 32) | void gpio_items_free(GPIOItems* items) {
  function gpio_items_get_count (line 37) | uint8_t gpio_items_get_count(GPIOItems* items) {
  function gpio_items_configure_pin (line 41) | void gpio_items_configure_pin(GPIOItems* items, uint8_t index, GpioMode ...
  function gpio_items_configure_all_pins (line 47) | void gpio_items_configure_all_pins(GPIOItems* items, GpioMode mode) {
  function gpio_items_set_pin (line 53) | void gpio_items_set_pin(GPIOItems* items, uint8_t index, bool level) {
  function gpio_items_set_all_pins (line 58) | void gpio_items_set_all_pins(GPIOItems* items, bool level) {

FILE: applications/main/gpio/gpio_items.h
  type GPIOItems (line 9) | typedef struct GPIOItems GPIOItems;

FILE: applications/main/gpio/scenes/gpio_scene.h
  type GpioScene (line 7) | typedef enum {

FILE: applications/main/gpio/scenes/gpio_scene_start.c
  type GpioItem (line 6) | enum GpioItem {
  type GpioOtg (line 12) | enum GpioOtg {
  function gpio_scene_start_var_list_enter_callback (line 23) | static void gpio_scene_start_var_list_enter_callback(void* context, uint...
  function gpio_scene_start_var_list_change_callback (line 33) | static void gpio_scene_start_var_list_change_callback(VariableItem* item) {
  function gpio_scene_start_on_enter (line 45) | void gpio_scene_start_on_enter(void* context) {
  function gpio_scene_start_on_event (line 77) | bool gpio_scene_start_on_event(void* context, SceneManagerEvent event) {
  function gpio_scene_start_on_exit (line 103) | void gpio_scene_start_on_exit(void* context) {

FILE: applications/main/gpio/scenes/gpio_scene_test.c
  function gpio_scene_test_ok_callback (line 3) | void gpio_scene_test_ok_callback(InputType type, void* context) {
  function gpio_scene_test_on_enter (line 14) | void gpio_scene_test_on_enter(void* context) {
  function gpio_scene_test_on_event (line 22) | bool gpio_scene_test_on_event(void* context, SceneManagerEvent event) {
  function gpio_scene_test_on_exit (line 28) | void gpio_scene_test_on_exit(void* context) {

FILE: applications/main/gpio/scenes/gpio_scene_usb_uart.c
  type SceneUsbUartBridge (line 4) | typedef struct {
  function gpio_scene_usb_uart_callback (line 11) | void gpio_scene_usb_uart_callback(GpioCustomEvent event, void* context) {
  function gpio_scene_usb_uart_dialog_callback (line 17) | void gpio_scene_usb_uart_dialog_callback(DialogExResult result, void* co...
  function gpio_scene_usb_uart_on_enter (line 29) | void gpio_scene_usb_uart_on_enter(void* context) {
  function gpio_scene_usb_uart_on_event (line 49) | bool gpio_scene_usb_uart_on_event(void* context, SceneManagerEvent event) {
  function gpio_scene_usb_uart_on_exit (line 77) | void gpio_scene_usb_uart_on_exit(void* context) {

FILE: applications/main/gpio/scenes/gpio_scene_usb_uart_close_rpc.c
  function gpio_scene_usb_uart_close_rpc_on_enter (line 4) | void gpio_scene_usb_uart_close_rpc_on_enter(void* context) {
  function gpio_scene_usb_uart_close_rpc_on_event (line 22) | bool gpio_scene_usb_uart_close_rpc_on_event(void* context, SceneManagerE...
  function gpio_scene_usb_uart_close_rpc_on_exit (line 38) | void gpio_scene_usb_uart_close_rpc_on_exit(void* context) {

FILE: applications/main/gpio/scenes/gpio_scene_usb_uart_config.c
  type LineIndex (line 5) | typedef enum {
  function gpio_scene_usb_uart_cfg_on_event (line 32) | bool gpio_scene_usb_uart_cfg_on_event(void* context, SceneManagerEvent e...
  function line_ensure_flow_invariant (line 44) | void line_ensure_flow_invariant(GpioApp* app) {
  function line_vcp_cb (line 61) | static void line_vcp_cb(VariableItem* item) {
  function line_port_cb (line 72) | static void line_port_cb(VariableItem* item) {
  function line_software_de_re_cb (line 88) | static void line_software_de_re_cb(VariableItem* item) {
  function line_flow_cb (line 99) | static void line_flow_cb(VariableItem* item) {
  function line_baudrate_cb (line 110) | static void line_baudrate_cb(VariableItem* item) {
  function gpio_scene_usb_uart_cfg_on_enter (line 129) | void gpio_scene_usb_uart_cfg_on_enter(void* context) {
  function gpio_scene_usb_uart_cfg_on_exit (line 181) | void gpio_scene_usb_uart_cfg_on_exit(void* context) {

FILE: applications/main/gpio/usb_uart_bridge.c
  type WorkerEvtFlags (line 25) | typedef enum {
  type UsbUartBridge (line 45) | struct UsbUartBridge {
  type usb_cdc_line_coding (line 72) | struct usb_cdc_line_coding
  function usb_uart_on_irq_rx_dma_cb (line 86) | static void usb_uart_on_irq_rx_dma_cb(
  function usb_uart_vcp_init (line 107) | static void usb_uart_vcp_init(UsbUartBridge* usb_uart, uint8_t vcp_ch) {
  function usb_uart_vcp_deinit (line 119) | static void usb_uart_vcp_deinit(UsbUartBridge* usb_uart, uint8_t vcp_ch) {
  function usb_uart_serial_init (line 127) | static void usb_uart_serial_init(UsbUartBridge* usb_uart, uint8_t uart_c...
  function usb_uart_serial_deinit (line 138) | static void usb_uart_serial_deinit(UsbUartBridge* usb_uart) {
  function usb_uart_set_baudrate (line 146) | static void usb_uart_set_baudrate(UsbUartBridge* usb_uart, uint32_t baud...
  function usb_uart_update_ctrl_lines (line 160) | static void usb_uart_update_ctrl_lines(UsbUartBridge* usb_uart) {
  function usb_uart_worker (line 170) | static int32_t usb_uart_worker(void* context) {
  function usb_uart_tx_thread (line 316) | static int32_t usb_uart_tx_thread(void* context) {
  function vcp_on_cdc_tx_complete (line 350) | static void vcp_on_cdc_tx_complete(void* context) {
  function vcp_on_cdc_rx (line 356) | static void vcp_on_cdc_rx(void* context) {
  function vcp_state_callback (line 361) | static void vcp_state_callback(void* context, uint8_t state) {
  function vcp_on_cdc_control_line (line 366) | static void vcp_on_cdc_control_line(void* context, uint8_t state) {
  function vcp_on_line_config (line 372) | static void vcp_on_line_config(void* context, struct usb_cdc_line_coding...
  function UsbUartBridge (line 378) | UsbUartBridge* usb_uart_enable(UsbUartConfig* cfg) {
  function usb_uart_disable (line 389) | void usb_uart_disable(UsbUartBridge* usb_uart) {
  function usb_uart_set_config (line 397) | void usb_uart_set_config(UsbUartBridge* usb_uart, UsbUartConfig* cfg) {
  function usb_uart_get_config (line 406) | void usb_uart_get_config(UsbUartBridge* usb_uart, UsbUartConfig* cfg) {
  function usb_uart_get_state (line 412) | void usb_uart_get_state(UsbUartBridge* usb_uart, UsbUartState* st) {

FILE: applications/main/gpio/usb_uart_bridge.h
  type UsbUartBridge (line 6) | typedef struct UsbUartBridge UsbUartBridge;
  type UsbUartConfig (line 8) | typedef struct {
  type UsbUartState (line 17) | typedef struct {

FILE: applications/main/gpio/views/gpio_test.c
  type GpioTest (line 6) | struct GpioTest {
  type GpioTestModel (line 12) | typedef struct {
  function gpio_test_draw_callback (line 21) | static void gpio_test_draw_callback(Canvas* canvas, void* _model) {
  function gpio_test_input_callback (line 37) | static bool gpio_test_input_callback(InputEvent* event, void* context) {
  function gpio_test_process_left (line 55) | static bool gpio_test_process_left(GpioTest* gpio_test) {
  function gpio_test_process_right (line 68) | static bool gpio_test_process_right(GpioTest* gpio_test) {
  function gpio_test_process_ok (line 81) | static bool gpio_test_process_ok(GpioTest* gpio_test, InputEvent* event) {
  function GpioTest (line 110) | GpioTest* gpio_test_alloc(GPIOItems* gpio_items) {
  function gpio_test_free (line 126) | void gpio_test_free(GpioTest* gpio_test) {
  function View (line 132) | View* gpio_test_get_view(GpioTest* gpio_test) {
  function gpio_test_set_ok_callback (line 137) | void gpio_test_set_ok_callback(GpioTest* gpio_test, GpioTestOkCallback c...

FILE: applications/main/gpio/views/gpio_test.h
  type GpioTest (line 7) | typedef struct GpioTest GpioTest;

FILE: applications/main/gpio/views/gpio_usb_uart.c
  type GpioUsbUart (line 7) | struct GpioUsbUart {
  type GpioUsbUartModel (line 13) | typedef struct {
  function gpio_usb_uart_draw_callback (line 24) | static void gpio_usb_uart_draw_callback(Canvas* canvas, void* _model) {
  function gpio_usb_uart_input_callback (line 89) | static bool gpio_usb_uart_input_callback(InputEvent* event, void* contex...
  function GpioUsbUart (line 105) | GpioUsbUart* gpio_usb_uart_alloc(void) {
  function gpio_usb_uart_free (line 117) | void gpio_usb_uart_free(GpioUsbUart* usb_uart) {
  function View (line 123) | View* gpio_usb_uart_get_view(GpioUsbUart* usb_uart) {
  function gpio_usb_uart_set_callback (line 128) | void gpio_usb_uart_set_callback(GpioUsbUart* usb_uart, GpioUsbUartCallba...
  function gpio_usb_uart_update_state (line 143) | void gpio_usb_uart_update_state(GpioUsbUart* instance, UsbUartConfig* cf...

FILE: applications/main/gpio/views/gpio_usb_uart.h
  type GpioUsbUart (line 7) | typedef struct GpioUsbUart GpioUsbUart;

FILE: applications/main/ibutton/ibutton.c
  function ibutton_make_app_folder (line 32) | static void ibutton_make_app_folder(iButton* ibutton) {
  function ibutton_rpc_command_callback (line 42) | static void ibutton_rpc_command_callback(const RpcAppSystemEvent* event,...
  function ibutton_custom_event_callback (line 62) | bool ibutton_custom_event_callback(void* context, uint32_t event) {
  function ibutton_back_event_callback (line 68) | bool ibutton_back_event_callback(void* context) {
  function ibutton_tick_event_callback (line 74) | void ibutton_tick_event_callback(void* context) {
  function iButton (line 80) | iButton* ibutton_alloc(void) {
  function ibutton_free (line 133) | void ibutton_free(iButton* ibutton) {
  function ibutton_load_key (line 176) | bool ibutton_load_key(iButton* ibutton, bool show_error) {
  function ibutton_select_and_load_key (line 196) | bool ibutton_select_and_load_key(iButton* ibutton) {
  function ibutton_save_key (line 217) | bool ibutton_save_key(iButton* ibutton) {
  function ibutton_delete_key (line 233) | bool ibutton_delete_key(iButton* ibutton) {
  function ibutton_reset_key (line 245) | void ibutton_reset_key(iButton* ibutton) {
  function ibutton_notification_message (line 251) | void ibutton_notification_message(iButton* ibutton, uint32_t message) {
  function ibutton_submenu_callback (line 256) | void ibutton_submenu_callback(void* context, uint32_t index) {
  function ibutton_widget_callback (line 261) | void ibutton_widget_callback(GuiButtonType result, InputType type, void*...
  function ibutton_app (line 268) | int32_t ibutton_app(void* arg) {

FILE: applications/main/ibutton/ibutton.h
  type iButton (line 3) | typedef struct iButton iButton;

FILE: applications/main/ibutton/ibutton_cli.c
  function ibutton_cli_print_usage (line 12) | static void ibutton_cli_print_usage(void) {
  function ibutton_cli_parse_key (line 24) | static bool ibutton_cli_parse_key(iButtonProtocols* protocols, iButtonKe...
  function ibutton_cli_print_key (line 56) | static void ibutton_cli_print_key(iButtonProtocols* protocols, iButtonKe...
  function ibutton_cli_worker_read_cb (line 77) | static void ibutton_cli_worker_read_cb(void* context) {
  function ibutton_cli_read (line 83) | static void ibutton_cli_read(PipeSide* pipe) {
  type iButtonWriteContext (line 117) | typedef struct {
  function ibutton_cli_worker_write_cb (line 122) | static void ibutton_cli_worker_write_cb(void* context, iButtonWorkerWrit...
  function ibutton_cli_write (line 129) | void ibutton_cli_write(PipeSide* pipe, FuriString* args) {
  function ibutton_cli_emulate (line 186) | void ibutton_cli_emulate(PipeSide* pipe, FuriString* args) {
  function execute (line 219) | static void execute(PipeSide* pipe, FuriString* args, void* context) {

FILE: applications/main/ibutton/ibutton_custom_event.h
  type iButtonCustomEvent (line 3) | typedef enum {

FILE: applications/main/ibutton/ibutton_i.h
  type iButtonWriteMode (line 37) | typedef enum {
  type iButton (line 43) | struct iButton {
  type iButtonView (line 69) | typedef enum {
  type iButtonNotificationMessage (line 78) | typedef enum {

FILE: applications/main/ibutton/scenes/ibutton_scene.h
  type iButtonScene (line 7) | typedef enum {

FILE: applications/main/ibutton/scenes/ibutton_scene_add_type.c
  function ibutton_scene_add_type_on_enter (line 3) | void ibutton_scene_add_type_on_enter(void* context) {
  function ibutton_scene_add_type_on_event (line 29) | bool ibutton_scene_add_type_on_event(void* context, SceneManagerEvent ev...
  function ibutton_scene_add_type_on_exit (line 51) | void ibutton_scene_add_type_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_add_value.c
  function ibutton_scene_add_type_byte_input_callback (line 3) | static void ibutton_scene_add_type_byte_input_callback(void* context) {
  function ibutton_scene_add_type_byte_changed_callback (line 8) | static void ibutton_scene_add_type_byte_changed_callback(void* context) {
  function ibutton_scene_add_value_on_enter (line 13) | void ibutton_scene_add_value_on_enter(void* context) {
  function ibutton_scene_add_value_on_event (line 31) | bool ibutton_scene_add_value_on_event(void* context, SceneManagerEvent e...
  function ibutton_scene_add_value_on_exit (line 76) | void ibutton_scene_add_value_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_delete_confirm.c
  function ibutton_scene_delete_confirm_on_enter (line 4) | void ibutton_scene_delete_confirm_on_enter(void* context) {
  function ibutton_scene_delete_confirm_on_event (line 39) | bool ibutton_scene_delete_confirm_on_event(void* context, SceneManagerEv...
  function ibutton_scene_delete_confirm_on_exit (line 61) | void ibutton_scene_delete_confirm_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_delete_success.c
  function ibutton_scene_delete_success_popup_callback (line 3) | static void ibutton_scene_delete_success_popup_callback(void* context) {
  function ibutton_scene_delete_success_on_enter (line 8) | void ibutton_scene_delete_success_on_enter(void* context) {
  function ibutton_scene_delete_success_on_event (line 22) | bool ibutton_scene_delete_success_on_event(void* context, SceneManagerEv...
  function ibutton_scene_delete_success_on_exit (line 37) | void ibutton_scene_delete_success_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_emulate.c
  function ibutton_scene_emulate_callback (line 7) | static void ibutton_scene_emulate_callback(void* context, bool emulated) {
  function ibutton_scene_emulate_on_enter (line 15) | void ibutton_scene_emulate_on_enter(void* context) {
  function ibutton_scene_emulate_on_event (line 48) | bool ibutton_scene_emulate_on_event(void* context, SceneManagerEvent eve...
  function ibutton_scene_emulate_on_exit (line 75) | void ibutton_scene_emulate_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_exit_confirm.c
  function ibutton_scene_exit_confirm_widget_callback (line 3) | static void ibutton_scene_exit_confirm_widget_callback(
  function ibutton_scene_exit_confirm_on_enter (line 13) | void ibutton_scene_exit_confirm_on_enter(void* context) {
  function ibutton_scene_exit_confirm_on_event (line 29) | bool ibutton_scene_exit_confirm_on_event(void* context, SceneManagerEven...
  function ibutton_scene_exit_confirm_on_exit (line 48) | void ibutton_scene_exit_confirm_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_info.c
  function ibutton_scene_info_on_enter (line 3) | void ibutton_scene_info_on_enter(void* context) {
  function ibutton_scene_info_on_event (line 41) | bool ibutton_scene_info_on_event(void* context, SceneManagerEvent event) {
  function ibutton_scene_info_on_exit (line 55) | void ibutton_scene_info_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_read.c
  function ibutton_scene_read_callback (line 4) | static void ibutton_scene_read_callback(void* context) {
  function ibutton_scene_read_on_enter (line 9) | void ibutton_scene_read_on_enter(void* context) {
  function ibutton_scene_read_on_event (line 27) | bool ibutton_scene_read_on_event(void* context, SceneManagerEvent event) {
  function ibutton_scene_read_on_exit (line 52) | void ibutton_scene_read_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_read_error.c
  function ibutton_scene_read_error_on_enter (line 4) | void ibutton_scene_read_error_on_enter(void* context) {
  function ibutton_scene_read_error_on_event (line 29) | bool ibutton_scene_read_error_on_event(void* context, SceneManagerEvent ...
  function ibutton_scene_read_error_on_exit (line 50) | void ibutton_scene_read_error_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_read_key_menu.c
  type SubmenuIndex (line 4) | typedef enum {
  function ibutton_scene_read_key_menu_submenu_callback (line 12) | void ibutton_scene_read_key_menu_submenu_callback(void* context, uint32_...
  function ibutton_scene_read_key_menu_on_enter (line 17) | void ibutton_scene_read_key_menu_on_enter(void* context) {
  function ibutton_scene_read_key_menu_on_event (line 65) | bool ibutton_scene_read_key_menu_on_event(void* context, SceneManagerEve...
  function ibutton_scene_read_key_menu_on_exit (line 97) | void ibutton_scene_read_key_menu_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_read_success.c
  function ibutton_scene_read_success_on_enter (line 5) | void ibutton_scene_read_success_on_enter(void* context) {
  function ibutton_scene_read_success_on_event (line 40) | bool ibutton_scene_read_success_on_event(void* context, SceneManagerEven...
  function ibutton_scene_read_success_on_exit (line 60) | void ibutton_scene_read_success_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_retry_confirm.c
  function ibutton_scene_retry_confirm_widget_callback (line 3) | static void ibutton_scene_retry_confirm_widget_callback(
  function ibutton_scene_retry_confirm_on_enter (line 13) | void ibutton_scene_retry_confirm_on_enter(void* context) {
  function ibutton_scene_retry_confirm_on_event (line 29) | bool ibutton_scene_retry_confirm_on_event(void* context, SceneManagerEve...
  function ibutton_scene_retry_confirm_on_exit (line 48) | void ibutton_scene_retry_confirm_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_rpc.c
  function ibutton_scene_rpc_on_enter (line 3) | void ibutton_scene_rpc_on_enter(void* context) {
  function ibutton_rpc_start_emulation (line 7) | static void ibutton_rpc_start_emulation(iButton* ibutton) {
  function ibutton_scene_rpc_on_event (line 22) | bool ibutton_scene_rpc_on_event(void* context, SceneManagerEvent event) {
  function ibutton_scene_rpc_on_exit (line 55) | void ibutton_scene_rpc_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_save_name.c
  function ibutton_scene_save_name_text_input_callback (line 8) | static void ibutton_scene_save_name_text_input_callback(void* context) {
  function ibutton_scene_save_name_on_enter (line 13) | void ibutton_scene_save_name_on_enter(void* context) {
  function ibutton_scene_save_name_on_event (line 40) | bool ibutton_scene_save_name_on_event(void* context, SceneManagerEvent e...
  function ibutton_scene_save_name_on_exit (line 87) | void ibutton_scene_save_name_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_save_success.c
  function ibutton_scene_save_success_popup_callback (line 3) | static void ibutton_scene_save_success_popup_callback(void* context) {
  function ibutton_scene_save_success_on_enter (line 8) | void ibutton_scene_save_success_on_enter(void* context) {
  function ibutton_scene_save_success_on_event (line 22) | bool ibutton_scene_save_success_on_event(void* context, SceneManagerEven...
  function ibutton_scene_save_success_on_exit (line 37) | void ibutton_scene_save_success_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_saved_key_menu.c
  type SubmenuIndex (line 4) | enum SubmenuIndex {
  function ibutton_scene_saved_key_menu_on_enter (line 14) | void ibutton_scene_saved_key_menu_on_enter(void* context) {
  function ibutton_scene_saved_key_menu_on_event (line 47) | bool ibutton_scene_saved_key_menu_on_event(void* context, SceneManagerEv...
  function ibutton_scene_saved_key_menu_on_exit (line 83) | void ibutton_scene_saved_key_menu_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_select_key.c
  function ibutton_scene_select_key_on_enter (line 3) | void ibutton_scene_select_key_on_enter(void* context) {
  function ibutton_scene_select_key_on_event (line 14) | bool ibutton_scene_select_key_on_event(void* context, SceneManagerEvent ...
  function ibutton_scene_select_key_on_exit (line 20) | void ibutton_scene_select_key_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_start.c
  type SubmenuIndex (line 5) | enum SubmenuIndex {
  function ibutton_scene_start_on_enter (line 11) | void ibutton_scene_start_on_enter(void* context) {
  function ibutton_scene_start_on_event (line 27) | bool ibutton_scene_start_on_event(void* context, SceneManagerEvent event) {
  function ibutton_scene_start_on_exit (line 47) | void ibutton_scene_start_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_view_data.c
  function ibutton_scene_view_data_on_enter (line 3) | void ibutton_scene_view_data_on_enter(void* context) {
  function ibutton_scene_view_data_on_event (line 17) | bool ibutton_scene_view_data_on_event(void* context, SceneManagerEvent e...
  function ibutton_scene_view_data_on_exit (line 23) | void ibutton_scene_view_data_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_write.c
  type iButtonSceneWriteState (line 3) | typedef enum {
  function iButtonCustomEvent (line 8) | static inline iButtonCustomEvent
  function ibutton_scene_write_callback (line 24) | static void ibutton_scene_write_callback(void* context, iButtonWorkerWri...
  function ibutton_scene_write_on_enter (line 30) | void ibutton_scene_write_on_enter(void* context) {
  function ibutton_scene_write_on_event (line 73) | bool ibutton_scene_write_on_event(void* context, SceneManagerEvent event) {
  function ibutton_scene_write_on_exit (line 93) | void ibutton_scene_write_on_exit(void* context) {

FILE: applications/main/ibutton/scenes/ibutton_scene_write_success.c
  function ibutton_scene_write_success_popup_callback (line 3) | static void ibutton_scene_write_success_popup_callback(void* context) {
  function ibutton_scene_write_success_on_enter (line 9) | void ibutton_scene_write_success_on_enter(void* context) {
  function ibutton_scene_write_success_on_event (line 26) | bool ibutton_scene_write_success_on_event(void* context, SceneManagerEve...
  function ibutton_scene_write_success_on_exit (line 42) | void ibutton_scene_write_success_on_exit(void* context) {

FILE: applications/main/infrared/infrared_app.c
  type InfraredSettings (line 19) | typedef struct {
  function infrared_make_app_folder (line 36) | static void infrared_make_app_folder(InfraredApp* infrared) {
  function infrared_custom_event_callback (line 42) | static bool infrared_custom_event_callback(void* context, uint32_t event) {
  function infrared_back_event_callback (line 48) | static bool infrared_back_event_callback(void* context) {
  function infrared_tick_event_callback (line 54) | static void infrared_tick_event_callback(void* context) {
  function infrared_rpc_command_callback (line 60) | static void infrared_rpc_command_callback(const RpcAppSystemEvent* event...
  function infrared_find_vacant_remote_name (line 112) | static void infrared_find_vacant_remote_name(FuriString* name, const cha...
  function InfraredApp (line 154) | static InfraredApp* infrared_alloc(void) {
  function infrared_free (line 240) | static void infrared_free(InfraredApp* infrared) {
  function InfraredErrorCode (line 313) | InfraredErrorCode infrared_add_remote_with_button(
  function InfraredErrorCode (line 341) | InfraredErrorCode
  function infrared_tx_start (line 371) | void infrared_tx_start(InfraredApp* infrared) {
  function InfraredErrorCode (line 401) | InfraredErrorCode infrared_tx_start_button_index(InfraredApp* infrared, ...
  function infrared_tx_stop (line 413) | void infrared_tx_stop(InfraredApp* infrared) {
  function infrared_tx_send_once (line 427) | void infrared_tx_send_once(InfraredApp* infrared) {
  function InfraredErrorCode (line 436) | InfraredErrorCode infrared_tx_send_once_button_index(InfraredApp* infrar...
  function infrared_blocking_task_start (line 447) | void infrared_blocking_task_start(InfraredApp* infrared, FuriThreadCallb...
  function InfraredErrorCode (line 453) | InfraredErrorCode infrared_blocking_task_finalize(InfraredApp* infrared) {
  function infrared_text_store_set (line 458) | void infrared_text_store_set(InfraredApp* infrared, uint32_t bank, const...
  function infrared_text_store_clear (line 467) | void infrared_text_store_clear(InfraredApp* infrared, uint32_t bank) {
  function infrared_play_notification_message (line 471) | void infrared_play_notification_message(
  function infrared_show_error_message (line 478) | void infrared_show_error_message(const InfraredApp* infrared, const char...
  function infrared_set_tx_pin (line 489) | void infrared_set_tx_pin(InfraredApp* infrared, FuriHalInfraredTxPin tx_...
  function infrared_enable_otg (line 503) | void infrared_enable_otg(InfraredApp* infrared, bool enable) {
  function infrared_load_settings (line 512) | static void infrared_load_settings(InfraredApp* infrared) {
  function infrared_save_settings (line 531) | void infrared_save_settings(InfraredApp* infrared) {
  function infrared_signal_received_callback (line 547) | void infrared_signal_received_callback(void* context, InfraredWorkerSign...
  function infrared_text_input_callback (line 570) | void infrared_text_input_callback(void* context) {
  function infrared_popup_closed_callback (line 577) | void infrared_popup_closed_callback(void* context) {
  function infrared_app (line 584) | int32_t infrared_app(void* p) {

FILE: applications/main/infrared/infrared_app.h
  type InfraredApp (line 13) | typedef struct InfraredApp InfraredApp;

FILE: applications/main/infrared/infrared_app_i.h
  type InfraredButtonIndex (line 58) | typedef enum {
  type InfraredEditTarget (line 65) | typedef enum {
  type InfraredEditMode (line 74) | typedef enum {
  type InfraredAppState (line 83) | typedef struct {
  type InfraredApp (line 99) | struct InfraredApp {
  type InfraredView (line 140) | typedef enum {
  type InfraredNotificationMessage (line 156) | typedef enum {

FILE: applications/main/infrared/infrared_cli.c
  function signal_received_callback (line 37) | static void signal_received_callback(void* context, InfraredWorkerSignal...
  function infrared_cli_print_universal_remotes (line 72) | static void infrared_cli_print_universal_remotes(void) {
  function infrared_cli_print_usage (line 103) | static void infrared_cli_print_usage(void) {
  function infrared_cli_start_ir_rx (line 127) | static void infrared_cli_start_ir_rx(PipeSide* pipe, FuriString* args) {
  function infrared_cli_parse_message (line 154) | static bool infrared_cli_parse_message(const char* str, InfraredSignal* ...
  function infrared_cli_parse_raw (line 169) | static bool infrared_cli_parse_raw(const char* str, InfraredSignal* sign...
  function infrared_cli_start_ir_tx (line 215) | static void infrared_cli_start_ir_tx(PipeSide* pipe, FuriString* args) {
  function infrared_cli_save_signal (line 231) | static bool
  function infrared_cli_decode_raw_signal (line 246) | static bool infrared_cli_decode_raw_signal(
  function infrared_cli_decode_file (line 294) | static bool infrared_cli_decode_file(FlipperFormat* input_file, FlipperF...
  function infrared_cli_process_decode (line 336) | static void infrared_cli_process_decode(PipeSide* pipe, FuriString* args) {
  function infrared_cli_list_remote_signals (line 400) | static void infrared_cli_list_remote_signals(FuriString* remote_name) {
  function infrared_cli_brute_force_signals (line 456) | static void infrared_cli_brute_force_signals(
  function infrared_cli_process_universal (line 507) | static void infrared_cli_process_universal(PipeSide* pipe, FuriString* a...
  function execute (line 529) | static void execute(PipeSide* pipe, FuriString* args, void* context) {

FILE: applications/main/infrared/infrared_custom_event.h
  type InfraredCustomEventType (line 6) | typedef enum {
  type InfraredCustomEvent (line 33) | typedef union {
  function infrared_custom_event_pack (line 42) | static inline uint32_t infrared_custom_event_pack(uint16_t type, int16_t...
  function infrared_custom_event_unpack (line 47) | static inline void
  function infrared_custom_event_get_type (line 54) | static inline uint16_t infrared_custom_event_get_type(uint32_t packed_va...
  function infrared_custom_event_get_value (line 60) | static inline int16_t infrared_custom_event_get_value(uint32_t packed_va...

FILE: applications/main/infrared/infrared_remote.c
  type InfraredRemote (line 17) | struct InfraredRemote {
  type InfraredBatch (line 23) | typedef struct {
  type InfraredBatchTarget (line 32) | typedef struct {
  type InfraredErrorCode (line 38) | typedef InfraredErrorCode (
  function InfraredRemote (line 41) | InfraredRemote* infrared_remote_alloc(void) {
  function infrared_remote_free (line 49) | void infrared_remote_free(InfraredRemote* remote) {
  function infrared_remote_reset (line 56) | void infrared_remote_reset(InfraredRemote* remote) {
  function infrared_remote_set_path (line 66) | static void infrared_remote_set_path(InfraredRemote* remote, const char*...
  function infrared_remote_get_signal_count (line 75) | size_t infrared_remote_get_signal_count(const InfraredRemote* remote) {
  function InfraredErrorCode (line 84) | InfraredErrorCode infrared_remote_load_signal(
  function infrared_remote_get_signal_index (line 116) | bool infrared_remote_get_signal_index(
  function InfraredErrorCode (line 134) | InfraredErrorCode infrared_remote_append_signal(
  function InfraredErrorCode (line 162) | static InfraredErrorCode infrared_remote_batch_start(
  function InfraredErrorCode (line 253) | static InfraredErrorCode infrared_remote_insert_signal_callback(
  function InfraredErrorCode (line 271) | InfraredErrorCode infrared_remote_insert_signal(
  function InfraredErrorCode (line 290) | static InfraredErrorCode infrared_remote_rename_signal_callback(
  function InfraredErrorCode (line 307) | InfraredErrorCode
  function InfraredErrorCode (line 321) | static InfraredErrorCode infrared_remote_delete_signal_callback(
  function InfraredErrorCode (line 337) | InfraredErrorCode infrared_remote_delete_signal(InfraredRemote* remote, ...
  function InfraredErrorCode (line 350) | InfraredErrorCode
  function InfraredErrorCode (line 378) | InfraredErrorCode infrared_remote_create(InfraredRemote* remote, const c...
  function InfraredErrorCode (line 403) | InfraredErrorCode infrared_remote_load(InfraredRemote* remote, const cha...
  function InfraredErrorCode (line 457) | InfraredErrorCode infrared_remote_rename(InfraredRemote* remote, const c...
  function InfraredErrorCode (line 473) | InfraredErrorCode infrared_remote_remove(InfraredRemote* remote) {

FILE: applications/main/infrared/infrared_remote.h
  type InfraredRemote (line 19) | typedef struct InfraredRemote InfraredRemote;

FILE: applications/main/infrared/scenes/common/infrared_scene_universal_common.c
  type InfraredSceneState (line 6) | typedef union {
  function infrared_scene_universal_common_item_callback (line 16) | void infrared_scene_universal_common_item_callback(void* context, uint32...
  function infrared_scene_universal_common_progress_input_callback (line 24) | static void infrared_scene_universal_common_progress_input_callback(
  function infrared_scene_universal_common_show_popup (line 32) | static void
  function infrared_scene_universal_common_hide_pop
Copy disabled (too large) Download .json
Condensed preview — 2844 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,417K chars).
[
  {
    "path": ".clang-format",
    "chars": 6747,
    "preview": "---\nLanguage:        Cpp\nAccessModifierOffset: -4\nAlignAfterOpenBracket: AlwaysBreak\nAlignArrayOfStructures: None\nAlignC"
  },
  {
    "path": ".clangd",
    "chars": 254,
    "preview": "CompileFlags:\n    Add: \n        - -Wno-unknown-warning-option\n        - -Wno-format\n    Remove: \n        - -mword-reloca"
  },
  {
    "path": ".editorconfig",
    "chars": 136,
    "preview": "root = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = true\ncharset = utf-8\n\n[*.{cpp,h,c,py,sh}]\nindent_style = space\n"
  },
  {
    "path": ".gitattributes",
    "chars": 64,
    "preview": "* text=auto eol=lf\n*.bat eol=crlf\n*.ps1 eol=crlf\n*.cmd eol=crlf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 3375,
    "preview": "# Who owns all the fish by default\n* @DrZlo13 @hedger @gsurkov\n\n# Apps\n/applications/debug/bt_debug_app/ @DrZlo13 @hedge"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/01_bug_report.yml",
    "chars": 1318,
    "preview": "name: Bug report\ndescription: File a bug reports regarding the firmware.\nlabels: ['bug']\nbody:\n- type: markdown\n  attrib"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/02_enhancements.yml",
    "chars": 796,
    "preview": "name: Enhancements\ndescription: Suggest improvements for any existing functionality within the firmware.\nbody:\n- type: m"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/03_feature_request.yml",
    "chars": 905,
    "preview": "name: Feature Request\ndescription: For feature requests regarding the firmware.\nlabels: ['feature request']\nbody:\n- type"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 189,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Need help?\n    url: https://forum.flipperzero.one\n    about: For any"
  },
  {
    "path": ".github/actions/submit_sdk/action.yml",
    "chars": 3261,
    "preview": "name: Submit SDK to Catalog\nauthor: hedger\ndescription: |\n  This action checks if SDK exists in the catalog and if not, "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 340,
    "preview": "# What's new\n\n- [ Describe changes here ]\n\n# Verification \n\n- [ Describe how to verify changes ]\n\n# Checklist (For Revie"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 7149,
    "preview": "name: 'Build'\n\non:\n  push:\n    branches:\n      - dev\n    tags:\n      - '*'\n  pull_request:\n\nenv:\n  DEFAULT_TARGET: f7\n  "
  },
  {
    "path": ".github/workflows/build_compact.yml",
    "chars": 2745,
    "preview": "name: 'Compact build'\n\non:\n  pull_request:\n\nenv:\n  FBT_TOOLCHAIN_PATH: /runner/_work\n  FBT_GIT_SUBMODULE_SHALLOW: 1\n  GH"
  },
  {
    "path": ".github/workflows/docs.yml",
    "chars": 2414,
    "preview": "name: 'Generate documentation with Doxygen'\n\non:\n  push:\n    branches:\n      - dev\n  pull_request:\n\nenv:\n  TARGETS: f7\n "
  },
  {
    "path": ".github/workflows/lint_and_submodule_check.yml",
    "chars": 4460,
    "preview": "name: 'Lint sources & check submodule integrity'\n\non:\n  pull_request:\n\nenv:\n  TARGETS: f7\n  FBT_TOOLCHAIN_PATH: /runner/"
  },
  {
    "path": ".github/workflows/merge_report.yml",
    "chars": 1193,
    "preview": "name: 'Check FL ticket in PR name'\n\non:\n  push:\n    branches:\n      - dev\n\nenv:\n  FBT_TOOLCHAIN_PATH: /runner/_work\n  GH"
  },
  {
    "path": ".github/workflows/pvs_studio.yml",
    "chars": 3649,
    "preview": "name: 'Static C/C++ analysis with PVS-Studio'\n\non:\n  push:\n    branches:\n      - dev\n  pull_request:\n\nenv:\n  TARGETS: f7"
  },
  {
    "path": ".github/workflows/reindex.yml",
    "chars": 938,
    "preview": "name: 'Post-release hooks'\n\non:\n  release:\n    types: [prereleased, released]\n\njobs:\n  reindex:\n    name: 'Post-release "
  },
  {
    "path": ".github/workflows/unit_tests.yml",
    "chars": 1882,
    "preview": "name: 'Unit tests'\non:\n  pull_request:\n\nenv:\n  TARGETS: f7\n  DEFAULT_TARGET: f7\n  FBT_TOOLCHAIN_PATH: /opt/\n  FBT_GIT_SU"
  },
  {
    "path": ".github/workflows/updater_test.yml",
    "chars": 979,
    "preview": "name: 'Updater test'\non:\n  pull_request:\n\nenv:\n  TARGETS: f7\n  DEFAULT_TARGET: f7\n  FBT_TOOLCHAIN_PATH: /opt/\n  FBT_GIT_"
  },
  {
    "path": ".gitignore",
    "chars": 733,
    "preview": "*~\n*.swp\n*.swo\n*.gdb_history\n*.old\n\n\n# LSP\n.cache\ncompile_commands.json\n\n# JetBrains IDEs\n.idea/\n\n# Sublime Text\n.sublim"
  },
  {
    "path": ".gitmodules",
    "chars": 1376,
    "preview": "[submodule \"lib/mlib\"]\n\tpath = lib/mlib\n\turl = https://github.com/P-p-H-d/mlib.git\n[submodule \"lib/nanopb\"]\n\tpath = lib/"
  },
  {
    "path": ".pvsconfig",
    "chars": 1040,
    "preview": "# MLib macros we can't do much about.\n//-V:M_LET:1048,1044\n//-V:M_EACH:1048,1044\n//-V:ARRAY_DEF:760,747,568,776,729,712,"
  },
  {
    "path": ".pvsoptions",
    "chars": 324,
    "preview": "--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Ker"
  },
  {
    "path": ".sublime-project",
    "chars": 671,
    "preview": "{\n    \"folders\":\n    [\n        {\n            \"path\": \".\",\n        }\n    ],\n    \"settings\": {\n        \"LSP\": {\n          "
  },
  {
    "path": ".vscode/ReadMe.md",
    "chars": 623,
    "preview": "# Visual Studio Code workspace for Flipper Zero {#vscode}\n\n## Setup\n\n * To start developing with VSCode, run `./fbt vsco"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5226,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "CODING_STYLE.md",
    "chars": 2882,
    "preview": "# Intro\n\nNice to see you reading this document, we really appreciate it.\n\nAs all documents of this kind it's unable to c"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4769,
    "preview": "# Welcome to FlipperZero contributing guide <!-- omit in toc -->\n\nThank you for investing your time in contributing to o"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "ReadMe.md",
    "chars": 6485,
    "preview": "<picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"/.github/assets/dark_theme_banner.png\">\n    <source m"
  },
  {
    "path": "SConstruct",
    "chars": 12294,
    "preview": "#\n# Main Flipper Build System entry point\n#\n# This file is evaluated by scons (the build system) every time fbt is invok"
  },
  {
    "path": "applications/ReadMe.md",
    "chars": 2948,
    "preview": "# Structure\n\n## debug \n\nApplications for factory testing the Flipper.\n\n- `accessor`            - Wiegand server \n- `batt"
  },
  {
    "path": "applications/debug/accessor/accessor.cpp",
    "chars": 200,
    "preview": "#include \"accessor_app.h\"\n\n// app enter function\nextern \"C\" int32_t accessor_app(void* p) {\n    UNUSED(p);\n    AccessorA"
  },
  {
    "path": "applications/debug/accessor/accessor_app.cpp",
    "chars": 3853,
    "preview": "#include \"accessor_app.h\"\n#include <furi.h>\n#include <furi_hal.h>\n#include <stdarg.h>\n#include <power/power_service/powe"
  },
  {
    "path": "applications/debug/accessor/accessor_app.h",
    "chars": 1475,
    "preview": "#pragma once\n#include <map>\n#include <list>\n#include \"accessor_view_manager.h\"\n#include \"scene/accessor_scene_start.h\"\n#"
  },
  {
    "path": "applications/debug/accessor/accessor_event.h",
    "chars": 259,
    "preview": "#pragma once\n#include <stdint.h>\n\nclass AccessorEvent {\npublic:\n    // events enum\n    enum class Type : uint8_t {\n     "
  },
  {
    "path": "applications/debug/accessor/accessor_view_manager.cpp",
    "chars": 2080,
    "preview": "#include \"accessor_view_manager.h\"\n#include \"accessor_event.h\"\n#include \"callback_connector.h\"\n\nAccessorAppViewManager::"
  },
  {
    "path": "applications/debug/accessor/accessor_view_manager.h",
    "chars": 730,
    "preview": "#pragma once\n#include <furi.h>\n#include <gui/view_holder.h>\n#include <gui/modules/submenu.h>\n#include <gui/modules/popup"
  },
  {
    "path": "applications/debug/accessor/application.fam",
    "chars": 209,
    "preview": "App(\n    appid=\"accessor\",\n    name=\"Accessor\",\n    apptype=FlipperAppType.DEBUG,\n    targets=[\"f7\"],\n    entry_point=\"a"
  },
  {
    "path": "applications/debug/accessor/callback_connector.h",
    "chars": 3358,
    "preview": "#ifndef CALLBACKCONNECTOR_H\n#define CALLBACKCONNECTOR_H\n\n#ifdef __cplusplus\n#include <functional>\nnamespace cbc {\nnamesp"
  },
  {
    "path": "applications/debug/accessor/helpers/wiegand.cpp",
    "chars": 6829,
    "preview": "#include \"wiegand.h\"\n#include <furi.h>\n#include <furi_hal.h>\n\nunsigned long WIEGAND::_cardTempHigh = 0;\nunsigned long WI"
  },
  {
    "path": "applications/debug/accessor/helpers/wiegand.h",
    "chars": 690,
    "preview": "#pragma once\n\nclass WIEGAND {\npublic:\n    WIEGAND(void);\n    void begin(void);\n    void end(void);\n    bool available(vo"
  },
  {
    "path": "applications/debug/accessor/scene/accessor_scene_generic.h",
    "chars": 274,
    "preview": "#pragma once\n#include \"../accessor_app.h\"\n\nclass AccessorApp;\n\nclass AccessorScene {\npublic:\n    virtual void on_enter(A"
  },
  {
    "path": "applications/debug/accessor/scene/accessor_scene_start.cpp",
    "chars": 2846,
    "preview": "#include \"../accessor_app.h\"\n#include \"../accessor_view_manager.h\"\n#include \"../accessor_event.h\"\n#include \"accessor_sce"
  },
  {
    "path": "applications/debug/accessor/scene/accessor_scene_start.h",
    "chars": 261,
    "preview": "#pragma once\n#include \"accessor_scene_generic.h\"\n\nclass AccessorSceneStart : public AccessorScene {\npublic:\n    void on_"
  },
  {
    "path": "applications/debug/application.fam",
    "chars": 361,
    "preview": "App(\n    appid=\"debug_apps\",\n    name=\"Basic debug apps bundle\",\n    apptype=FlipperAppType.METAPACKAGE,\n    provides=[\n"
  },
  {
    "path": "applications/debug/battery_test_app/application.fam",
    "chars": 258,
    "preview": "App(\n    appid=\"battery_test\",\n    name=\"Battery Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"battery_test_"
  },
  {
    "path": "applications/debug/battery_test_app/battery_test_app.c",
    "chars": 3740,
    "preview": "#include \"battery_test_app.h\"\n\n#include <notification/notification_messages.h>\n\nvoid battery_test_dialog_callback(Dialog"
  },
  {
    "path": "applications/debug/battery_test_app/battery_test_app.h",
    "chars": 601,
    "preview": "#include <furi.h>\n#include <power/power_service/power.h>\n#include <gui/gui.h>\n#include <gui/view.h>\n#include <gui/view_d"
  },
  {
    "path": "applications/debug/battery_test_app/views/battery_info.c",
    "chars": 5082,
    "preview": "#include \"battery_info.h\"\n#include <furi.h>\n#include <gui/elements.h>\n#include <assets_icons.h>\n\n#define LOW_CHARGE_THRE"
  },
  {
    "path": "applications/debug/battery_test_app/views/battery_info.h",
    "chars": 515,
    "preview": "#pragma once\n\n#include <gui/view.h>\n\ntypedef struct BatteryInfo BatteryInfo;\n\ntypedef struct {\n    float vbus_voltage;\n "
  },
  {
    "path": "applications/debug/blink_test/application.fam",
    "chars": 195,
    "preview": "App(\n    appid=\"blink_test\",\n    name=\"Blink Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"blink_test_app\",\n"
  },
  {
    "path": "applications/debug/blink_test/blink_test.c",
    "chars": 3671,
    "preview": "#include <furi.h>\n#include <furi_hal.h>\n\n#include <gui/gui.h>\n#include <input/input.h>\n\n#include <notification/notificat"
  },
  {
    "path": "applications/debug/bt_debug_app/application.fam",
    "chars": 311,
    "preview": "App(\n    appid=\"bt_debug\",\n    name=\"Bluetooth Debug\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"bt_debug_app\","
  },
  {
    "path": "applications/debug/bt_debug_app/bt_debug_app.c",
    "chars": 3692,
    "preview": "#include \"bt_debug_app.h\"\n#include <furi_hal_bt.h>\n\n#define TAG \"BtDebugApp\"\n\nenum BtDebugSubmenuIndex {\n    BtDebugSubm"
  },
  {
    "path": "applications/debug/bt_debug_app/bt_debug_app.h",
    "chars": 538,
    "preview": "#pragma once\n\n#include <furi.h>\n#include <gui/gui.h>\n#include <gui/view.h>\n#include <gui/view_dispatcher.h>\n#include <gu"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_carrier_test.c",
    "chars": 6988,
    "preview": "#include \"bt_carrier_test.h\"\n#include \"bt_test.h\"\n#include \"bt_test_types.h\"\n#include <furi_hal_bt.h>\n\nstruct BtCarrierT"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_carrier_test.h",
    "chars": 250,
    "preview": "#pragma once\n#include <gui/view.h>\n\ntypedef struct BtCarrierTest BtCarrierTest;\n\nBtCarrierTest* bt_carrier_test_alloc(vo"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_packet_test.c",
    "chars": 5492,
    "preview": "#include \"bt_packet_test.h\"\n#include \"bt_test.h\"\n#include \"bt_test_types.h\"\n#include <furi_hal_bt.h>\n\nstruct BtPacketTes"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_packet_test.h",
    "chars": 240,
    "preview": "#pragma once\n#include <gui/view.h>\n\ntypedef struct BtPacketTest BtPacketTest;\n\nBtPacketTest* bt_packet_test_alloc(void);"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_test.c",
    "chars": 13238,
    "preview": "#include \"bt_test.h\"\n\n#include <gui/canvas.h>\n#include <gui/elements.h>\n\n#include <lib/toolbox/float_tools.h>\n#include <"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_test.h",
    "chars": 1366,
    "preview": "#pragma once\n#include <gui/view.h>\n\ntypedef enum {\n    BtTestStateStarted,\n    BtTestStateStopped,\n} BtTestState;\n\ntyped"
  },
  {
    "path": "applications/debug/bt_debug_app/views/bt_test_types.h",
    "chars": 500,
    "preview": "#pragma once\n\ntypedef enum {\n    BtTestModeRx,\n    BtTestModeTx,\n    BtTestModeTxHopping,\n} BtTestMode;\n\ntypedef enum {\n"
  },
  {
    "path": "applications/debug/ccid_test/application.fam",
    "chars": 251,
    "preview": "App(\n    appid=\"ccid_test\",\n    name=\"CCID Debug\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"ccid_test_app\",\n  "
  },
  {
    "path": "applications/debug/ccid_test/ccid_test_app.c",
    "chars": 3943,
    "preview": "#include <stdint.h>\n#include <furi.h>\n#include <furi_hal.h>\n\n#include <gui/view.h>\n#include <gui/view_dispatcher.h>\n#inc"
  },
  {
    "path": "applications/debug/ccid_test/ccid_test_app_commands.c",
    "chars": 4184,
    "preview": "#include \"iso7816/iso7816_t0_apdu.h\"\n#include \"iso7816/iso7816_response.h\"\n\n//Instruction 1: returns an OK response unco"
  },
  {
    "path": "applications/debug/ccid_test/ccid_test_app_commands.h",
    "chars": 205,
    "preview": "#include \"iso7816/iso7816_t0_apdu.h\"\n\nvoid iso7816_answer_to_reset(Iso7816Atr* atr);\n\nvoid iso7816_process_command(\n    "
  },
  {
    "path": "applications/debug/ccid_test/client/ccid_client.py",
    "chars": 3317,
    "preview": "#!/usr/bin/env python\n# pylint: disable=missing-module-docstring, too-many-arguments, consider-using-f-string, missing-f"
  },
  {
    "path": "applications/debug/ccid_test/client/requirements.txt",
    "chars": 45,
    "preview": "pyscard\n# or sudo apt install python3-pyscard"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_atr.h",
    "chars": 77,
    "preview": "#pragma once\n\ntypedef struct {\n    uint8_t TS;\n    uint8_t T0;\n} Iso7816Atr;\n"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_handler.c",
    "chars": 3198,
    "preview": "// transforms low level calls such as XFRCallback or ICC Power on to a structured one\n// an application can register the"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_handler.h",
    "chars": 493,
    "preview": "#pragma once\n\n#include <stdint.h>\n#include \"iso7816_atr.h\"\n#include \"iso7816_t0_apdu.h\"\n\ntypedef struct {\n    void (*iso"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_response.c",
    "chars": 286,
    "preview": "#include <stdint.h>\n#include \"iso7816_t0_apdu.h\"\n#include \"iso7816_response.h\"\n\nvoid iso7816_set_response(ISO7816_Respon"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_response.h",
    "chars": 486,
    "preview": "#pragma once\n\n#define ISO7816_RESPONSE_OK 0x9000\n\n#define ISO7816_RESPONSE_WRONG_LENGTH              0x6700\n#define ISO7"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_t0_apdu.c",
    "chars": 3003,
    "preview": "/* Implements rudimentary iso7816-3 support for APDU (T=0) */\n#include <stdint.h>\n#include <string.h>\n#include \"iso7816_"
  },
  {
    "path": "applications/debug/ccid_test/iso7816/iso7816_t0_apdu.h",
    "chars": 1082,
    "preview": "#pragma once\n\n#include <stdint.h>\n#include \"iso7816_atr.h\"\n#include \"core/common_defines.h\"\n\n#define ISO7816_READ_COMMAN"
  },
  {
    "path": "applications/debug/crash_test/application.fam",
    "chars": 195,
    "preview": "App(\n    appid=\"crash_test\",\n    name=\"Crash Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"crash_test_app\",\n"
  },
  {
    "path": "applications/debug/crash_test/crash_test.c",
    "chars": 5631,
    "preview": "#include <furi_hal.h>\n#include <furi.h>\n\n#include <gui/gui.h>\n#include <gui/view_dispatcher.h>\n#include <gui/modules/sub"
  },
  {
    "path": "applications/debug/direct_draw/application.fam",
    "chars": 207,
    "preview": "App(\n    appid=\"direct_draw\",\n    name=\"Direct Draw\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"direct_draw_app"
  },
  {
    "path": "applications/debug/direct_draw/direct_draw.c",
    "chars": 3181,
    "preview": "#include <furi.h>\n#include <gui/gui.h>\n#include <input/input.h>\n\n#define BUFFER_SIZE (32U)\n\ntypedef struct {\n    FuriPub"
  },
  {
    "path": "applications/debug/display_test/application.fam",
    "chars": 224,
    "preview": "App(\n    appid=\"display_test\",\n    name=\"Display Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"display_test_"
  },
  {
    "path": "applications/debug/display_test/display_test.c",
    "chars": 6887,
    "preview": "#include <furi_hal.h>\n#include <furi.h>\n\n// Need access to u8g2\n#include <gui/gui_i.h>\n#include <gui/canvas_i.h>\n#includ"
  },
  {
    "path": "applications/debug/display_test/view_display_test.c",
    "chars": 6069,
    "preview": "#include \"view_display_test.h\"\n\ntypedef struct {\n    uint32_t test;\n    uint32_t size;\n    uint32_t counter;\n    bool fl"
  },
  {
    "path": "applications/debug/display_test/view_display_test.h",
    "chars": 273,
    "preview": "#pragma once\n\n#include <stdint.h>\n#include <gui/view.h>\n\ntypedef struct ViewDisplayTest ViewDisplayTest;\n\nViewDisplayTes"
  },
  {
    "path": "applications/debug/event_loop_blink_test/application.fam",
    "chars": 230,
    "preview": "App(\n    appid=\"event_loop_blink_test\",\n    name=\"Event Loop Blink Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_po"
  },
  {
    "path": "applications/debug/event_loop_blink_test/event_loop_blink_test.c",
    "chars": 4684,
    "preview": "#include <furi.h>\n#include <furi_hal_resources.h>\n\n#include <gui/gui.h>\n#include <gui/elements.h>\n#include <gui/view_por"
  },
  {
    "path": "applications/debug/expansion_test/application.fam",
    "chars": 281,
    "preview": "App(\n    appid=\"expansion_test\",\n    name=\"Expansion Module Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"ex"
  },
  {
    "path": "applications/debug/expansion_test/assets/test.txt",
    "chars": 906,
    "preview": "\"Did you ever hear the tragedy of Darth Plagueis the Wise?\"\n\"No.\"\n\"I thought not. It's not a story the Jedi would tell y"
  },
  {
    "path": "applications/debug/expansion_test/expansion_test.c",
    "chars": 18257,
    "preview": "/**\n * @file expansion_test.c\n * @brief Expansion module support testing application.\n *\n * Before running, connect pins"
  },
  {
    "path": "applications/debug/file_browser_test/application.fam",
    "chars": 240,
    "preview": "App(\n    appid=\"file_browser_test\",\n    name=\"File Browser Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"fil"
  },
  {
    "path": "applications/debug/file_browser_test/file_browser_app.c",
    "chars": 3337,
    "preview": "#include \"file_browser_app_i.h\"\n#include <file_browser_test_icons.h>\n\n#include <gui/modules/file_browser.h>\n#include <st"
  },
  {
    "path": "applications/debug/file_browser_test/file_browser_app_i.h",
    "chars": 754,
    "preview": "#pragma once\n\n#include \"scenes/file_browser_scene.h\"\n\n#include <gui/gui.h>\n#include <gui/view_dispatcher.h>\n#include <gu"
  },
  {
    "path": "applications/debug/file_browser_test/scenes/file_browser_scene.c",
    "chars": 1119,
    "preview": "#include \"file_browser_scene.h\"\n\n// Generate scene on_enter handlers array\n#define ADD_SCENE(prefix, name, id) prefix##_"
  },
  {
    "path": "applications/debug/file_browser_test/scenes/file_browser_scene.h",
    "chars": 928,
    "preview": "#pragma once\n\n#include <gui/scene_manager.h>\n\n// Generate scene id and total number\n#define ADD_SCENE(prefix, name, id) "
  },
  {
    "path": "applications/debug/file_browser_test/scenes/file_browser_scene_browser.c",
    "chars": 1173,
    "preview": "#include \"../file_browser_app_i.h\"\n#include <furi.h>\n\n#define DEFAULT_PATH \"/\"\n#define EXTENSION    \"*\"\n\nbool file_brows"
  },
  {
    "path": "applications/debug/file_browser_test/scenes/file_browser_scene_config.h",
    "chars": 120,
    "preview": "ADD_SCENE(file_browser, start, Start)\nADD_SCENE(file_browser, browser, Browser)\nADD_SCENE(file_browser, result, Result)\n"
  },
  {
    "path": "applications/debug/file_browser_test/scenes/file_browser_scene_result.c",
    "chars": 1114,
    "preview": "#include \"../file_browser_app_i.h\"\n#include <furi.h>\n\nvoid file_browser_scene_result_ok_callback(InputType type, void* c"
  },
  {
    "path": "applications/debug/file_browser_test/scenes/file_browser_scene_start.c",
    "chars": 1490,
    "preview": "#include \"../file_browser_app_i.h\"\n\n#include <furi_hal.h>\n#include <gui/modules/widget_elements/widget_element_i.h>\n#inc"
  },
  {
    "path": "applications/debug/infrared_test/application.fam",
    "chars": 177,
    "preview": "App(\n    appid=\"infrared_test\",\n    name=\"Infrared Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"infrared_te"
  },
  {
    "path": "applications/debug/infrared_test/infrared_test.c",
    "chars": 1554,
    "preview": "#include <furi.h>\n#include <furi_hal_infrared.h>\n\n#define TAG \"InfraredTest\"\n\n#define CARRIER_FREQ_HZ (38000UL)\n#define "
  },
  {
    "path": "applications/debug/keypad_test/application.fam",
    "chars": 198,
    "preview": "App(\n    appid=\"keypad_test\",\n    name=\"Keypad Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"keypad_test_app"
  },
  {
    "path": "applications/debug/keypad_test/keypad_test.c",
    "chars": 5152,
    "preview": "#include <furi.h>\n#include <gui/gui.h>\n#include <input/input.h>\n\n#define TAG \"KeypadTest\"\n\ntypedef struct {\n    bool pre"
  },
  {
    "path": "applications/debug/lfrfid_debug/application.fam",
    "chars": 283,
    "preview": "App(\n    appid=\"lfrfid_debug\",\n    name=\"LF-RFID Debug\",\n    apptype=FlipperAppType.DEBUG,\n    targets=[\"f7\"],\n    entry"
  },
  {
    "path": "applications/debug/lfrfid_debug/lfrfid_debug.c",
    "chars": 2372,
    "preview": "#include \"lfrfid_debug_i.h\"\n\nstatic bool lfrfid_debug_custom_event_callback(void* context, uint32_t event) {\n    furi_as"
  },
  {
    "path": "applications/debug/lfrfid_debug/lfrfid_debug_i.h",
    "chars": 589,
    "preview": "#pragma once\n#include <furi.h>\n#include <furi_hal.h>\n\n#include <gui/gui.h>\n#include <gui/view.h>\n#include <gui/view_disp"
  },
  {
    "path": "applications/debug/lfrfid_debug/scenes/lfrfid_debug_app_scene_start.c",
    "chars": 1239,
    "preview": "#include \"../lfrfid_debug_i.h\"\n\ntypedef enum {\n    SubmenuIndexTune,\n} SubmenuIndex;\n\nstatic void lfrfid_debug_scene_sta"
  },
  {
    "path": "applications/debug/lfrfid_debug/scenes/lfrfid_debug_app_scene_tune.c",
    "chars": 1552,
    "preview": "#include \"../lfrfid_debug_i.h\"\n#include <furi_hal.h>\n\nstatic void comparator_trigger_callback(bool level, void* comp_ctx"
  },
  {
    "path": "applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.c",
    "chars": 1083,
    "preview": "#include \"lfrfid_debug_scene.h\"\n\n// Generate scene on_enter handlers array\n#define ADD_SCENE(prefix, name, id) prefix##_"
  },
  {
    "path": "applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.h",
    "chars": 928,
    "preview": "#pragma once\n\n#include <gui/scene_manager.h>\n\n// Generate scene id and total number\n#define ADD_SCENE(prefix, name, id) "
  },
  {
    "path": "applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene_config.h",
    "chars": 74,
    "preview": "ADD_SCENE(lfrfid_debug, start, Start)\nADD_SCENE(lfrfid_debug, tune, Tune)\n"
  },
  {
    "path": "applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c",
    "chars": 6976,
    "preview": "#include \"lfrfid_debug_view_tune.h\"\n#include <gui/elements.h>\n\n#define TEMP_STR_LEN 128\n\nstruct LfRfidTuneView {\n    Vie"
  },
  {
    "path": "applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h",
    "chars": 662,
    "preview": "#pragma once\n#include <gui/view.h>\n\ntypedef struct LfRfidTuneView LfRfidTuneView;\n\nLfRfidTuneView* lfrfid_debug_view_tun"
  },
  {
    "path": "applications/debug/loader_chaining_a/application.fam",
    "chars": 202,
    "preview": "App(\n    appid=\"loader_chaining_a\",\n    name=\"Loader Chaining Test: App A\",\n    apptype=FlipperAppType.DEBUG,\n    entry_"
  },
  {
    "path": "applications/debug/loader_chaining_a/loader_chaining_a.c",
    "chars": 5376,
    "preview": "#include <furi.h>\n#include <gui/gui.h>\n#include <gui/view_dispatcher.h>\n#include <gui/modules/submenu.h>\n#include <loade"
  },
  {
    "path": "applications/debug/loader_chaining_b/application.fam",
    "chars": 202,
    "preview": "App(\n    appid=\"loader_chaining_b\",\n    name=\"Loader Chaining Test: App B\",\n    apptype=FlipperAppType.DEBUG,\n    entry_"
  },
  {
    "path": "applications/debug/loader_chaining_b/loader_chaining_b.c",
    "chars": 1046,
    "preview": "#include <furi.h>\n#include <dialogs/dialogs.h>\n#include <loader/loader.h>\n\nint32_t chaining_test_app_b(const char* arg) "
  },
  {
    "path": "applications/debug/locale_test/application.fam",
    "chars": 208,
    "preview": "App(\n    appid=\"locale_test\",\n    name=\"Locale Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"locale_test_app"
  },
  {
    "path": "applications/debug/locale_test/locale_test.c",
    "chars": 2837,
    "preview": "#include <furi.h>\n#include <gui/gui.h>\n#include <gui/elements.h>\n#include <gui/view_dispatcher.h>\n#include <gui/modules/"
  },
  {
    "path": "applications/debug/rpc_debug_app/application.fam",
    "chars": 221,
    "preview": "App(\n    appid=\"rpc_debug\",\n    name=\"RPC Debug\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"rpc_debug_app\",\n   "
  },
  {
    "path": "applications/debug/rpc_debug_app/rpc_debug_app.c",
    "chars": 5882,
    "preview": "#include \"rpc_debug_app.h\"\n#include <core/log.h>\n\n#include <string.h>\n\nstatic bool rpc_debug_app_custom_event_callback(v"
  },
  {
    "path": "applications/debug/rpc_debug_app/rpc_debug_app.h",
    "chars": 1335,
    "preview": "#pragma once\n\n#include <furi.h>\n#include <gui/gui.h>\n#include <gui/view.h>\n#include <gui/scene_manager.h>\n#include <gui/"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene.c",
    "chars": 1094,
    "preview": "#include \"rpc_debug_app_scene.h\"\n\n// Generate scene on_enter handlers array\n#define ADD_SCENE(prefix, name, id) prefix##"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene.h",
    "chars": 933,
    "preview": "#pragma once\n\n#include <gui/scene_manager.h>\n\n// Generate scene id and total number\n#define ADD_SCENE(prefix, name, id) "
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_config.h",
    "chars": 459,
    "preview": "ADD_SCENE(rpc_debug_app, start, Start)\nADD_SCENE(rpc_debug_app, start_dummy, StartDummy)\nADD_SCENE(rpc_debug_app, test_a"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_data_exchange.c",
    "chars": 1347,
    "preview": "#include \"../rpc_debug_app.h\"\n\nstatic void rpc_debug_app_scene_input_data_exchange_result_callback(void* context) {\n    "
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_error_code.c",
    "chars": 2107,
    "preview": "#include \"../rpc_debug_app.h\"\n\n#include <lib/toolbox/strint.h>\n\nstatic bool rpc_debug_app_scene_input_error_code_validat"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_error_text.c",
    "chars": 1394,
    "preview": "#include \"../rpc_debug_app.h\"\n\nstatic void rpc_debug_app_scene_input_error_text_result_callback(void* context) {\n    Rpc"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_receive_data_exchange.c",
    "chars": 1185,
    "preview": "#include \"../rpc_debug_app.h\"\n\nvoid rpc_debug_app_scene_receive_data_exchange_on_enter(void* context) {\n    RpcDebugApp*"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_start.c",
    "chars": 1743,
    "preview": "#include \"../rpc_debug_app.h\"\n\nenum SubmenuIndex {\n    SubmenuIndexTestAppError,\n    SubmenuIndexTestDataExchange,\n};\n\ns"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_start_dummy.c",
    "chars": 772,
    "preview": "#include \"../rpc_debug_app.h\"\n\nvoid rpc_debug_app_scene_start_dummy_on_enter(void* context) {\n    RpcDebugApp* app = con"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_test_app_error.c",
    "chars": 1789,
    "preview": "#include \"../rpc_debug_app.h\"\n\ntypedef enum {\n    SubmenuIndexSetErrorCode,\n    SubmenuIndexSetErrorText,\n} SubmenuIndex"
  },
  {
    "path": "applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_test_data_exchange.c",
    "chars": 1799,
    "preview": "#include \"../rpc_debug_app.h\"\n\ntypedef enum {\n    SubmenuIndexSendData,\n    SubmenuIndexReceiveData,\n} SubmenuIndex;\n\nst"
  },
  {
    "path": "applications/debug/speaker_debug/application.fam",
    "chars": 251,
    "preview": "App(\n    appid=\"speaker_debug\",\n    name=\"Speaker Debug\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"speaker_deb"
  },
  {
    "path": "applications/debug/speaker_debug/speaker_debug.c",
    "chars": 3524,
    "preview": "#include <furi.h>\n#include <notification/notification.h>\n#include <music_worker/music_worker.h>\n#include <toolbox/args.h"
  },
  {
    "path": "applications/debug/subghz_test/application.fam",
    "chars": 309,
    "preview": "App(\n    appid=\"subghz_test\",\n    name=\"Sub-Ghz test\",\n    apptype=FlipperAppType.DEBUG,\n    targets=[\"f7\"],\n    entry_p"
  },
  {
    "path": "applications/debug/subghz_test/helpers/subghz_test_event.h",
    "chars": 164,
    "preview": "#pragma once\n\ntypedef enum {\n    //SubGhzTestCustomEvent\n    SubGhzTestCustomEventStartId = 100,\n    SubGhzTestCustomEve"
  },
  {
    "path": "applications/debug/subghz_test/helpers/subghz_test_frequency.c",
    "chars": 780,
    "preview": "#include \"subghz_test_frequency.h\"\n\nconst uint32_t subghz_frequencies_testing[] = {\n    /* 300 - 348 */\n    300000000,\n "
  },
  {
    "path": "applications/debug/subghz_test/helpers/subghz_test_frequency.h",
    "chars": 213,
    "preview": "#pragma once\n#include \"../subghz_test_app_i.h\"\n\nextern const uint32_t subghz_frequencies_testing[];\nextern const uint32_"
  },
  {
    "path": "applications/debug/subghz_test/helpers/subghz_test_types.h",
    "chars": 449,
    "preview": "#pragma once\n\n#include <furi.h>\n#include <furi_hal.h>\n\n#define SUBGHZ_TEST_VERSION_APP \"0.1\"\n#define SUBGHZ_TEST_DEVELOP"
  },
  {
    "path": "applications/debug/subghz_test/protocol/math.c",
    "chars": 6729,
    "preview": "#include \"math.h\"\n\nuint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count) {\n    uint64_t reverse_k"
  },
  {
    "path": "applications/debug/subghz_test/protocol/math.h",
    "chars": 6295,
    "preview": "#pragma once\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stddef.h>\n\n#define bit_read(value, bit) (((value) >> (b"
  },
  {
    "path": "applications/debug/subghz_test/protocol/princeton_for_testing.c",
    "chars": 9550,
    "preview": "#include \"princeton_for_testing.h\"\n\n#include <furi_hal.h>\n#include \"math.h\"\n\n/*\n * Help\n * https://phreakerclub.com/447\n"
  },
  {
    "path": "applications/debug/subghz_test/protocol/princeton_for_testing.h",
    "chars": 2799,
    "preview": "#pragma once\n\n//#include \"base.h\"\n#include <furi.h>\n#include <lib/toolbox/level_duration.h>\n\n/** SubGhzDecoderPrinceton "
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene.c",
    "chars": 1131,
    "preview": "#include \"../subghz_test_app_i.h\" // IWYU pragma: keep\n\n// Generate scene on_enter handlers array\n#define ADD_SCENE(pref"
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene.h",
    "chars": 920,
    "preview": "#pragma once\n\n#include <gui/scene_manager.h>\n\n// Generate scene id and total number\n#define ADD_SCENE(prefix, name, id) "
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_about.c",
    "chars": 1957,
    "preview": "#include \"../subghz_test_app_i.h\"\n\nvoid subghz_test_scene_about_widget_callback(GuiButtonType result, InputType type, vo"
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_carrier.c",
    "chars": 994,
    "preview": "#include \"../subghz_test_app_i.h\"\n\nvoid subghz_test_scene_carrier_callback(SubGhzTestCarrierEvent event, void* context) "
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_config.h",
    "chars": 242,
    "preview": "ADD_SCENE(subghz_test, start, Start)\nADD_SCENE(subghz_test, about, About)\nADD_SCENE(subghz_test, carrier, Carrier)\nADD_S"
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_packet.c",
    "chars": 984,
    "preview": "#include \"../subghz_test_app_i.h\"\n\nvoid subghz_test_scene_packet_callback(SubGhzTestPacketEvent event, void* context) {\n"
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c",
    "chars": 1743,
    "preview": "#include \"../subghz_test_app_i.h\"\n#include <subghz_test_icons.h>\n\nvoid subghz_test_scene_show_only_rx_popup_callback(voi"
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_start.c",
    "chars": 2503,
    "preview": "#include \"../subghz_test_app_i.h\"\n\ntypedef enum {\n    SubmenuIndexSubGhzTestCarrier,\n    SubmenuIndexSubGhzTestPacket,\n "
  },
  {
    "path": "applications/debug/subghz_test/scenes/subghz_test_scene_static.c",
    "chars": 984,
    "preview": "#include \"../subghz_test_app_i.h\"\n\nvoid subghz_test_scene_static_callback(SubGhzTestStaticEvent event, void* context) {\n"
  },
  {
    "path": "applications/debug/subghz_test/subghz_test_app.c",
    "chars": 4304,
    "preview": "#include \"subghz_test_app_i.h\"\n\n#include <furi.h>\n#include <furi_hal.h>\n\nstatic bool subghz_test_app_custom_event_callba"
  },
  {
    "path": "applications/debug/subghz_test/subghz_test_app_i.c",
    "chars": 44,
    "preview": "#include <furi.h>\n\n#define TAG \"SubGhzTest\"\n"
  },
  {
    "path": "applications/debug/subghz_test/subghz_test_app_i.h",
    "chars": 856,
    "preview": "#pragma once\n\n#include \"helpers/subghz_test_types.h\"\n#include \"helpers/subghz_test_event.h\"\n\n#include \"scenes/subghz_tes"
  },
  {
    "path": "applications/debug/subghz_test/views/subghz_test_carrier.c",
    "chars": 7435,
    "preview": "#include \"subghz_test_carrier.h\"\n#include \"../helpers/subghz_test_frequency.h\"\n#include <lib/subghz/devices/cc1101_confi"
  },
  {
    "path": "applications/debug/subghz_test/views/subghz_test_carrier.h",
    "chars": 600,
    "preview": "#pragma once\n\n#include <gui/view.h>\n\ntypedef enum {\n    SubGhzTestCarrierEventOnlyRx,\n} SubGhzTestCarrierEvent;\n\ntypedef"
  },
  {
    "path": "applications/debug/subghz_test/views/subghz_test_packet.c",
    "chars": 9465,
    "preview": "#include \"subghz_test_packet.h\"\n#include \"../helpers/subghz_test_frequency.h\"\n#include <lib/subghz/devices/cc1101_config"
  },
  {
    "path": "applications/debug/subghz_test/views/subghz_test_packet.h",
    "chars": 582,
    "preview": "#pragma once\n\n#include <gui/view.h>\n\ntypedef enum {\n    SubGhzTestPacketEventOnlyRx,\n} SubGhzTestPacketEvent;\n\ntypedef s"
  },
  {
    "path": "applications/debug/subghz_test/views/subghz_test_static.c",
    "chars": 6640,
    "preview": "#include \"subghz_test_static.h\"\n#include \"../helpers/subghz_test_frequency.h\"\n#include <lib/subghz/devices/cc1101_config"
  },
  {
    "path": "applications/debug/subghz_test/views/subghz_test_static.h",
    "chars": 572,
    "preview": "#pragma once\n\n#include <gui/view.h>\n\ntypedef enum {\n    SubGhzTestStaticEventOnlyRx,\n} SubGhzTestStaticEvent;\n\ntypedef s"
  },
  {
    "path": "applications/debug/text_box_element_test/application.fam",
    "chars": 228,
    "preview": "App(\n    appid=\"text_box_element_test\",\n    name=\"Text Box Element Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_po"
  },
  {
    "path": "applications/debug/text_box_element_test/text_box_element_test.c",
    "chars": 3671,
    "preview": "#include <furi.h>\n#include <gui/gui.h>\n#include <input/input.h>\n#include <gui/elements.h>\n\n#define TAG \"TextBoxTest\"\n\nst"
  },
  {
    "path": "applications/debug/text_box_view_test/application.fam",
    "chars": 219,
    "preview": "App(\n    appid=\"text_box_view_test\",\n    name=\"Text Box View Test\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"t"
  },
  {
    "path": "applications/debug/text_box_view_test/text_box_view_test.c",
    "chars": 11227,
    "preview": "#include <furi.h>\n#include <gui/gui.h>\n#include <gui/view_dispatcher.h>\n#include <gui/modules/text_box.h>\n#include <gui/"
  },
  {
    "path": "applications/debug/uart_echo/application.fam",
    "chars": 192,
    "preview": "App(\n    appid=\"uart_echo\",\n    name=\"UART Echo\",\n    apptype=FlipperAppType.DEBUG,\n    entry_point=\"uart_echo_app\",\n   "
  },
  {
    "path": "applications/debug/uart_echo/uart_echo.c",
    "chars": 13345,
    "preview": "#include <furi.h>\n#include <furi_hal.h>\n\n#include <gui/gui.h>\n#include <gui/elements.h>\n#include <gui/view_dispatcher.h>"
  },
  {
    "path": "applications/debug/unit_tests/application.fam",
    "chars": 6103,
    "preview": "App(\n    appid=\"unit_tests\",\n    apptype=FlipperAppType.STARTUP,\n    entry_point=\"unit_tests_on_system_start\",\n    sourc"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/Manifest_test",
    "chars": 4616,
    "preview": "V:0\nT:1672935435\nD:infrared\nD:nfc\nD:subghz\nF:4bff70f2a2ae771f81de5cfb090b3d74:3952:infrared/test_kaseikyo.irtest\nF:8556d"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_kaseikyo.irtest",
    "chars": 3952,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 1000000 3363 1685 407 436 411 432 415 1240 434"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_nec.irtest",
    "chars": 21463,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 2640671 9071 4445 601 497 578 500 604 501 603 "
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_nec42.irtest",
    "chars": 2012,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: encoder_decoder_input1\ntype: parsed_array\ncount: 26\n#\nprotocol: NEC42\naddress"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_nec42ext.irtest",
    "chars": 3522,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 2000000 9000 4500 560 560 560 560 560 560 560 "
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_necext.irtest",
    "chars": 18976,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 1915384 8967 4463 587 527 590 524 584 1647 590"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_pioneer.irtest",
    "chars": 6008,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 25557 8437 4188 571 1538 595 1514 567 1542 570"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_rc5.irtest",
    "chars": 7460,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 27888 888 888 1776 1776 1776 888 888 1776 888 "
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_rc5x.irtest",
    "chars": 547,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 27888 1776 888 888 1776 1776 888 888 1776 888 "
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_rc6.irtest",
    "chars": 8608,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 27000 2666 889 444 888 444 444 444 444 444 888"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_rca.irtest",
    "chars": 2762,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 1000000 3994 3969 552 1945 551 1945 552 1945 5"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_samsung32.irtest",
    "chars": 16975,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 3129767 4513 4483 565 530 586 1670 563 1664 58"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/infrared/test_sirc.irtest",
    "chars": 41623,
    "preview": "Filetype: IR tests file\nVersion: 1\n#\nname: decoder_input1\ntype: raw\ndata: 1000000 2420 608 1194 608 596 604 1198 603 591"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/js/basic.js",
    "chars": 616,
    "preview": "let tests = require(\"tests\");\nlet flipper = require(\"flipper\");\n\ntests.assert_eq(1337, 1337);\ntests.assert_eq(\"hello\", \""
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/js/event_loop.js",
    "chars": 760,
    "preview": "let tests = require(\"tests\");\nlet event_loop = require(\"event_loop\");\n\nlet ext = {\n    i: 0,\n    received: false,\n};\n\nle"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/js/math.js",
    "chars": 1831,
    "preview": "let tests = require(\"tests\");\nlet math = require(\"math\");\n\n// math.EPSILON on Flipper Zero is 2.22044604925031308085e-16"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/js/storage.js",
    "chars": 5747,
    "preview": "let storage = require(\"storage\");\nlet tests = require(\"tests\");\n\nlet baseDir = \"/ext/.tmp/unit_tests\";\n\ntests.assert_eq("
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Felica.nfc",
    "chars": 2224,
    "preview": "Filetype: Flipper NFC device\nVersion: 4\n# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO1569"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Ntag213_locked.nfc",
    "chars": 1503,
    "preview": "Filetype: Flipper NFC device\nVersion: 3\n# Nfc device type can be UID, Mifare Ultralight, Mifare Classic\nDevice type: NTA"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Ntag215.nfc",
    "chars": 3431,
    "preview": "Filetype: Flipper NFC device\nVersion: 3\n# Nfc device type can be UID, Mifare Ultralight, Mifare Classic\nDevice type: NTA"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Ntag216.nfc",
    "chars": 5553,
    "preview": "Filetype: Flipper NFC device\nVersion: 2\n# Nfc device type can be UID, Mifare Ultralight, Mifare Classic, Bank card\nDevic"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Slix_cap_accept_all_pass.nfc",
    "chars": 2658,
    "preview": "Filetype: Flipper NFC device\nVersion: 4\n# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO1569"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Slix_cap_default.nfc",
    "chars": 2647,
    "preview": "Filetype: Flipper NFC device\nVersion: 4\n# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO1569"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Slix_cap_missed.nfc",
    "chars": 2528,
    "preview": "Filetype: Flipper NFC device\nVersion: 4\n# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO1569"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Ultralight_11.nfc",
    "chars": 991,
    "preview": "Filetype: Flipper NFC device\nVersion: 3\n# Nfc device type can be UID, Mifare Ultralight, Mifare Classic\nDevice type: Mif"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Ultralight_21.nfc",
    "chars": 1432,
    "preview": "Filetype: Flipper NFC device\nVersion: 3\n# Nfc device type can be UID, Mifare Ultralight, Mifare Classic\nDevice type: Mif"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/Ultralight_C.nfc",
    "chars": 1718,
    "preview": "Filetype: Flipper NFC device\nVersion: 4\n# Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO1569"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/nfc_nfca_signal_long.nfc",
    "chars": 4183,
    "preview": "Filetype: Flipper NFC test\nVersion: 1\nData length: 18\nPlain data: f1 99 41 43 a1 2f 23 01 de f3 c5 8d 91 4b 1e 50 4a c9\n"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/nfc/nfc_nfca_signal_short.nfc",
    "chars": 1021,
    "preview": "Filetype: Flipper NFC test\nVersion: 1\nData length: 4\nPlain data: 14 d8 a0 c9\nTimings length: 296\nTimings: 37 37 36 37 37"
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/storage/md5.txt",
    "chars": 32,
    "preview": "Yo dawg, I heard you like md5..."
  },
  {
    "path": "applications/debug/unit_tests/resources/unit_tests/subghz/alutech_at_4n_raw.sub",
    "chars": 10159,
    "preview": "Filetype: Flipper SubGhz RAW File\nVersion: 1\nFrequency: 433920000\nPreset: FuriHalSubGhzPresetOok650Async\nProtocol: RAW\nR"
  }
]

// ... and 2644 more files (download for full content)

About this extraction

This page contains the full source code of the flipperdevices/flipperzero-firmware GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2844 files (47.0 MB), approximately 4.1M tokens, and a symbol index with 13637 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!