# Symbols

| Symbol | Kind | File:Line | Signature |
|--------|------|-----------|-----------|
| `CLIRunner` | class | `lazyown_infinitestorage.py:723` | `class CLIRunner` |
| `ErrorCorrector` | class | `lazyown_infinitestorage.py:192` | `class ErrorCorrector` |
| `FFmpegPipeline` | class | `lazyown_infinitestorage.py:313` | `class FFmpegPipeline` |
| `FrameDecoder` | class | `lazyown_infinitestorage.py:281` | `class FrameDecoder` |
| `FrameEncoder` | class | `lazyown_infinitestorage.py:250` | `class FrameEncoder` |
| `GUIRunner` | class | `lazyown_infinitestorage.py:802` | `class GUIRunner(QWidget)` |
| `GUIRunner` | class | `lazyown_infinitestorage.py:938` | `class GUIRunner` |
| `LazyOwnConfig` | class | `lazyown_infinitestorage.py:72` | `class LazyOwnConfig` |
| `LazyOwnInfiniteStorage` | class | `lazyown_infinitestorage.py:527` | `class LazyOwnInfiniteStorage` |
| `LegacyProtocolHandler` | class | `lazyown_infinitestorage.py:448` | `class LegacyProtocolHandler(ProtocolHandler)` |
| `ProtocolHandler` | class | `lazyown_infinitestorage.py:436` | `class ProtocolHandler` |
| `SecureProtocolHandler` | class | `lazyown_infinitestorage.py:473` | `class SecureProtocolHandler(ProtocolHandler)` |
| `SecurityValidator` | class | `lazyown_infinitestorage.py:156` | `class SecurityValidator` |
| `WebRunner` | class | `lazyown_infinitestorage.py:949` | `class WebRunner` |
| `WebRunner` | class | `lazyown_infinitestorage.py:1062` | `class WebRunner` |
| `Worker` | class | `lazyown_infinitestorage.py:783` | `class Worker(QThread)` |
| `__init__` | method | `lazyown_infinitestorage.py:159` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:195` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:253` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:284` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:316` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:451` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:476` | `def __init__(self, config, corrector)` |
| `__init__` | method | `lazyown_infinitestorage.py:530` | `def __init__(self, config)` |
| `__init__` | method | `lazyown_infinitestorage.py:726` | `def __init__(self, storage)` |
| `__init__` | method | `lazyown_infinitestorage.py:789` | `def __init__(self, func)` |
| `__init__` | method | `lazyown_infinitestorage.py:805` | `def __init__(self, storage)` |
| `__init__` | method | `lazyown_infinitestorage.py:941` | `def __init__(self, storage)` |
| `__init__` | method | `lazyown_infinitestorage.py:952` | `def __init__(self, storage)` |
| `__init__` | method | `lazyown_infinitestorage.py:1065` | `def __init__(self, storage)` |
| `_browse_input` | method | `lazyown_infinitestorage.py:890` | `def _browse_input(self)` |
| `_change_mode` | method | `lazyown_infinitestorage.py:879` | `def _change_mode(self)` |
| `_create_frame` | method | `lazyown_infinitestorage.py:271` | `def _create_frame(self, bits, width, height, block_size, blocks_per_row)` |
| `_decode_legacy` | method | `lazyown_infinitestorage.py:621` | `def _decode_legacy(self, input_path, output_path, block_size)` |
| `_decode_nibble` | method | `lazyown_infinitestorage.py:230` | `def _decode_nibble(self, byte_val)` |
| `_decode_secure` | method | `lazyown_infinitestorage.py:634` | `def _decode_secure(self, input_path, output_path, block_size)` |
| `_detect_protocol` | method | `lazyown_infinitestorage.py:588` | `def _detect_protocol(self, input_path, block_size)` |
| `_encode_nibble` | method | `lazyown_infinitestorage.py:219` | `def _encode_nibble(self, nibble)` |
| `_get_video_info_ffprobe` | method | `lazyown_infinitestorage.py:335` | `def _get_video_info_ffprobe(self, input_path)` |
| `_init_ui` | method | `lazyown_infinitestorage.py:811` | `def _init_ui(self)` |
| `_is_within_directory` | method | `lazyown_infinitestorage.py:647` | `def _is_within_directory(self, directory, target)` |
| `_on_error` | method | `lazyown_infinitestorage.py:928` | `def _on_error(self, message)` |
| `_on_finished` | method | `lazyown_infinitestorage.py:923` | `def _on_finished(self, message)` |
| `_setup_routes` | method | `lazyown_infinitestorage.py:969` | `def _setup_routes(self)` |
| `_start` | method | `lazyown_infinitestorage.py:900` | `def _start(self)` |
| `_validate_encoding_parameters` | method | `lazyown_infinitestorage.py:578` | `def _validate_encoding_parameters(self, frame_width, frame_height, fps, block_size)` |
| `_validate_upload` | function | `lazyown_infinitestorage.py:974` | `def _validate_upload(input_file, action)` |
| `add_security_headers` | function | `lazyown_infinitestorage.py:1045` | `def add_security_headers(response)` |
| `bits_to_frames` | method | `lazyown_infinitestorage.py:256` | `def bits_to_frames(self, bit_string, frame_width, frame_height, block_size)` |
| `create_web_runner` | method | `lazyown_infinitestorage.py:540` | `def create_web_runner(self)` |
| `create_zip` | method | `lazyown_infinitestorage.py:653` | `def create_zip(self, source_path, output_zip)` |
| `decode` | method | `lazyown_infinitestorage.py:567` | `def decode(self, input_path, output_path, block_size, protocol_version)` |
| `decode_data` | method | `lazyown_infinitestorage.py:208` | `def decode_data(self, data)` |
| `download` | function | `lazyown_infinitestorage.py:1037` | `def download(filename)` |
| `encode` | method | `lazyown_infinitestorage.py:544` | `def encode(self, input_path, output_path, frame_width, frame_height, fps, block_size, protocol_version)` |
| `encode_data` | method | `lazyown_infinitestorage.py:198` | `def encode_data(self, data)` |
| `encode_video` | method | `lazyown_infinitestorage.py:374` | `def encode_video(self, frame_generator, output_path, frame_width, frame_height, fps)` |
| `extract_bits_from_raw_frames` | method | `lazyown_infinitestorage.py:287` | `def extract_bits_from_raw_frames(self, raw_bytes, width, height, block_size, expected_bits)` |
| `extract_raw_frames` | method | `lazyown_infinitestorage.py:401` | `def extract_raw_frames(self, input_path, target_width, target_height, max_frames)` |
| `extract_zip` | method | `lazyown_infinitestorage.py:672` | `def extract_zip(self, zip_path, output_dir)` |
| `get_metadata` | method | `lazyown_infinitestorage.py:355` | `def get_metadata(self, input_path)` |
| `get_video_info` | method | `lazyown_infinitestorage.py:319` | `def get_video_info(self, input_path)` |
| `index` | function | `lazyown_infinitestorage.py:992` | `def index()` |
| `main` | function | `lazyown_infinitestorage.py:1120` | `def main()` |
| `pack` | method | `lazyown_infinitestorage.py:439` | `def pack(self, data, frame_width, frame_height, block_size, fps)` |
| `pack` | method | `lazyown_infinitestorage.py:454` | `def pack(self, data, frame_width, frame_height, block_size, fps)` |
| `pack` | method | `lazyown_infinitestorage.py:480` | `def pack(self, data, frame_width, frame_height, block_size, fps)` |
| `run` | method | `lazyown_infinitestorage.py:729` | `def run(self)` |
| `run` | method | `lazyown_infinitestorage.py:795` | `def run(self)` |
| `run` | method | `lazyown_infinitestorage.py:933` | `def run(self)` |
| `run` | method | `lazyown_infinitestorage.py:944` | `def run(self)` |
| `run` | method | `lazyown_infinitestorage.py:1057` | `def run(self, host, port)` |
| `run` | method | `lazyown_infinitestorage.py:1068` | `def run(self, host, port)` |
| `run_setup` | method | `lazyown_infinitestorage.py:963` | `def run_setup(self)` |
| `run_tests` | function | `lazyown_infinitestorage.py:1072` | `def run_tests()` |
| `sanitize_filename` | method | `lazyown_infinitestorage.py:177` | `def sanitize_filename(self, filename)` |
| `unpack` | method | `lazyown_infinitestorage.py:443` | `def unpack(self, bit_string, block_size)` |
| `unpack` | method | `lazyown_infinitestorage.py:459` | `def unpack(self, bit_string, block_size)` |
| `unpack` | method | `lazyown_infinitestorage.py:499` | `def unpack(self, bit_string, block_size)` |
| `validate_extension` | method | `lazyown_infinitestorage.py:185` | `def validate_extension(self, file_path, allowed_extensions)` |
| `validate_file_path` | method | `lazyown_infinitestorage.py:162` | `def validate_file_path(self, file_path, must_exist)` |
| `validate_size` | method | `lazyown_infinitestorage.py:172` | `def validate_size(self, size)` |
| `video_to_zip` | method | `lazyown_infinitestorage.py:707` | `def video_to_zip(self, input_video, output_dir, block_size, protocol_version)` |
| `zip_to_video` | method | `lazyown_infinitestorage.py:693` | `def zip_to_video(self, source_path, output_video, frame_width, frame_height, fps, block_size, protocol_version)` |
| `_build_tools` | function | `mcp_server.py:213` | `def _build_tools()` |
| `_parse_frame_size` | function | `mcp_server.py:62` | `def _parse_frame_size(value)` |
| `_protocol_value` | function | `mcp_server.py:69` | `def _protocol_value(protocol)` |
| `_run` | function | `mcp_server.py:302` | `def _run()` |
| `_tool_create_zip` | function | `mcp_server.py:179` | `def _tool_create_zip(arguments)` |
| `_tool_decode` | function | `mcp_server.py:157` | `def _tool_decode(arguments)` |
| `_tool_encode` | function | `mcp_server.py:131` | `def _tool_encode(arguments)` |
| `_tool_extract_zip` | function | `mcp_server.py:191` | `def _tool_extract_zip(arguments)` |
| `_tool_video_to_zip` | function | `mcp_server.py:107` | `def _tool_video_to_zip(arguments)` |
| `_tool_zip_to_video` | function | `mcp_server.py:79` | `def _tool_zip_to_video(arguments)` |
| `call_tool` | function | `mcp_server.py:314` | `def call_tool(name, arguments)` |
| `list_tools` | function | `mcp_server.py:310` | `def list_tools()` |
| `main` | function | `mcp_server.py:330` | `def main()` |
| `_parse_frame_size` | function | `skill_lazyown_infinitestorage/tools.py:34` | `def _parse_frame_size(frame_size_str)` |
| `_protocol_value` | function | `skill_lazyown_infinitestorage/tools.py:42` | `def _protocol_value(protocol)` |
| `get_tool` | function | `skill_lazyown_infinitestorage/tools.py:453` | `def get_tool(name)` |
| `lazyown_create_zip` | function | `skill_lazyown_infinitestorage/tools.py:236` | `def lazyown_create_zip(params)` |
| `lazyown_extract_zip` | function | `skill_lazyown_infinitestorage/tools.py:268` | `def lazyown_extract_zip(params)` |
| `lazyown_infinitestorage_decode` | function | `skill_lazyown_infinitestorage/tools.py:105` | `def lazyown_infinitestorage_decode(params)` |
| `lazyown_infinitestorage_encode` | function | `skill_lazyown_infinitestorage/tools.py:52` | `def lazyown_infinitestorage_encode(params)` |
| `lazyown_infinitestorage_upload_to_youtube` | function | `skill_lazyown_infinitestorage/tools.py:299` | `def lazyown_infinitestorage_upload_to_youtube(params)` |
| `lazyown_video_to_zip` | function | `skill_lazyown_infinitestorage/tools.py:195` | `def lazyown_video_to_zip(params)` |
| `lazyown_zip_to_video` | function | `skill_lazyown_infinitestorage/tools.py:149` | `def lazyown_zip_to_video(params)` |
| `list_tools` | function | `skill_lazyown_infinitestorage/tools.py:457` | `def list_tools()` |
| `TestErrorCorrector` | class | `tests/test_error_correction.py:7` | `class TestErrorCorrector` |
| `setup` | method | `tests/test_error_correction.py:11` | `def setup(self)` |
| `test_decode_data_rejects_odd_length` | method | `tests/test_error_correction.py:33` | `def test_decode_data_rejects_odd_length(self)` |
| `test_decode_data_reverses_encoding` | method | `tests/test_error_correction.py:20` | `def test_decode_data_reverses_encoding(self)` |
| `test_decode_data_with_single_bit_error` | method | `tests/test_error_correction.py:26` | `def test_decode_data_with_single_bit_error(self)` |
| `test_decode_nibble_all_values` | method | `tests/test_error_correction.py:42` | `def test_decode_nibble_all_values(self)` |
| `test_encode_data_doubles_length` | method | `tests/test_error_correction.py:15` | `def test_encode_data_doubles_length(self)` |
| `test_encode_nibble_all_values` | method | `tests/test_error_correction.py:37` | `def test_encode_nibble_all_values(self)` |
| `test_roundtrip_various_inputs` | method | `tests/test_error_correction.py:49` | `def test_roundtrip_various_inputs(self, data)` |
| `test_single_bit_error_per_nibble` | method | `tests/test_error_correction.py:55` | `def test_single_bit_error_per_nibble(self, nibble)` |
| `TestFrameDecoder` | class | `tests/test_frames.py:54` | `class TestFrameDecoder` |
| `TestFrameEncoder` | class | `tests/test_frames.py:8` | `class TestFrameEncoder` |
| `setup` | method | `tests/test_frames.py:12` | `def setup(self)` |
| `setup` | method | `tests/test_frames.py:58` | `def setup(self)` |
| `test_bit_one_produces_white_block` | method | `tests/test_frames.py:33` | `def test_bit_one_produces_white_block(self)` |
| `test_bit_zero_produces_black_block` | method | `tests/test_frames.py:38` | `def test_bit_zero_produces_black_block(self)` |
| `test_bits_to_frames_yields_correct_number_of_frames` | method | `tests/test_frames.py:16` | `def test_bits_to_frames_yields_correct_number_of_frames(self)` |
| `test_each_frame_has_correct_dimensions` | method | `tests/test_frames.py:28` | `def test_each_frame_has_correct_dimensions(self)` |
| `test_extract_bits_from_empty_raises` | method | `tests/test_frames.py:62` | `def test_extract_bits_from_empty_raises(self)` |
| `test_extract_bits_from_raw_frames_basic` | method | `tests/test_frames.py:66` | `def test_extract_bits_from_raw_frames_basic(self)` |
| `test_extract_bits_from_resized_frame` | method | `tests/test_frames.py:82` | `def test_extract_bits_from_resized_frame(self)` |
| `test_extract_bits_respects_expected_bits` | method | `tests/test_frames.py:74` | `def test_extract_bits_respects_expected_bits(self)` |
| `test_padding_zeros_fill_incomplete_frame` | method | `tests/test_frames.py:43` | `def test_padding_zeros_fill_incomplete_frame(self)` |
| `TestEncodeDecodeRoundtrip` | class | `tests/test_integration.py:18` | `class TestEncodeDecodeRoundtrip` |
| `TestWebRunner` | class | `tests/test_integration.py:131` | `class TestWebRunner` |
| `setup` | method | `tests/test_integration.py:22` | `def setup(self)` |
| `setup` | method | `tests/test_integration.py:135` | `def setup(self)` |
| `test_decode_upload` | method | `tests/test_integration.py:167` | `def test_decode_upload(self)` |
| `test_download_not_found` | method | `tests/test_integration.py:199` | `def test_download_not_found(self)` |
| `test_empty_file_roundtrip` | method | `tests/test_integration.py:96` | `def test_empty_file_roundtrip(self)` |
| `test_encode_upload` | method | `tests/test_integration.py:147` | `def test_encode_upload(self)` |
| `test_index_get` | method | `tests/test_integration.py:142` | `def test_index_get(self)` |
| `test_large_file_roundtrip` | method | `tests/test_integration.py:110` | `def test_large_file_roundtrip(self)` |
| `test_legacy_protocol_roundtrip` | method | `tests/test_integration.py:44` | `def test_legacy_protocol_roundtrip(self)` |
| `test_missing_file_error` | method | `tests/test_integration.py:203` | `def test_missing_file_error(self)` |
| `test_protocol_auto_detection_prefers_secure` | method | `tests/test_integration.py:83` | `def test_protocol_auto_detection_prefers_secure(self)` |
| `test_secure_protocol_resilient_to_resolution_change` | method | `tests/test_integration.py:62` | `def test_secure_protocol_resilient_to_resolution_change(self)` |
| `test_secure_protocol_roundtrip` | method | `tests/test_integration.py:26` | `def test_secure_protocol_roundtrip(self)` |
| `test_security_headers_present` | method | `tests/test_integration.py:193` | `def test_security_headers_present(self)` |
| `TestLegacyProtocolHandler` | class | `tests/test_protocols.py:7` | `class TestLegacyProtocolHandler` |
| `TestSecureProtocolHandler` | class | `tests/test_protocols.py:35` | `class TestSecureProtocolHandler` |
| `setup` | method | `tests/test_protocols.py:11` | `def setup(self)` |
| `setup` | method | `tests/test_protocols.py:39` | `def setup(self)` |
| `test_pack_includes_end_marker` | method | `tests/test_protocols.py:15` | `def test_pack_includes_end_marker(self)` |
| `test_pack_produces_bit_string` | method | `tests/test_protocols.py:44` | `def test_pack_produces_bit_string(self)` |
| `test_roundtrip_various_sizes` | method | `tests/test_protocols.py:80` | `def test_roundtrip_various_sizes(self, size)` |
| `test_unpack_detects_corrupted_header` | method | `tests/test_protocols.py:55` | `def test_unpack_detects_corrupted_header(self)` |
| `test_unpack_detects_corrupted_payload` | method | `tests/test_protocols.py:66` | `def test_unpack_detects_corrupted_payload(self)` |
| `test_unpack_recovers_original_data` | method | `tests/test_protocols.py:49` | `def test_unpack_recovers_original_data(self)` |
| `test_unpack_strips_end_marker` | method | `tests/test_protocols.py:21` | `def test_unpack_strips_end_marker(self)` |
| `test_unpack_with_trailing_zeros` | method | `tests/test_protocols.py:27` | `def test_unpack_with_trailing_zeros(self)` |
| `TestLazyOwnConfig` | class | `tests/test_security.py:9` | `class TestLazyOwnConfig` |
| `TestSecurityValidator` | class | `tests/test_security.py:37` | `class TestSecurityValidator` |
| `setup` | method | `tests/test_security.py:41` | `def setup(self)` |
| `test_default_values_within_bounds` | method | `tests/test_security.py:18` | `def test_default_values_within_bounds(self)` |
| `test_header_offsets_are_consistent` | method | `tests/test_security.py:24` | `def test_header_offsets_are_consistent(self)` |
| `test_magic_bytes_are_valid` | method | `tests/test_security.py:12` | `def test_magic_bytes_are_valid(self)` |
| `test_max_file_size_is_reasonable` | method | `tests/test_security.py:31` | `def test_max_file_size_is_reasonable(self)` |
| `test_protocol_versions_are_distinct` | method | `tests/test_security.py:15` | `def test_protocol_versions_are_distinct(self)` |
| `test_sanitize_filename_fallback` | method | `tests/test_security.py:74` | `def test_sanitize_filename_fallback(self)` |
| `test_sanitize_filename_preserves_safe_characters` | method | `tests/test_security.py:70` | `def test_sanitize_filename_preserves_safe_characters(self)` |
| `test_sanitize_filename_strips_unsafe_characters` | method | `tests/test_security.py:65` | `def test_sanitize_filename_strips_unsafe_characters(self)` |
| `test_validate_extension_accepts_allowed` | method | `tests/test_security.py:77` | `def test_validate_extension_accepts_allowed(self)` |
| `test_validate_extension_rejects_disallowed` | method | `tests/test_security.py:81` | `def test_validate_extension_rejects_disallowed(self)` |
| `test_validate_file_path_must_exist_when_required` | method | `tests/test_security.py:54` | `def test_validate_file_path_must_exist_when_required(self)` |
| `test_validate_file_path_rejects_traversal` | method | `tests/test_security.py:50` | `def test_validate_file_path_rejects_traversal(self)` |
| `test_validate_file_path_resolves_absolute` | method | `tests/test_security.py:45` | `def test_validate_file_path_resolves_absolute(self)` |
| `test_validate_size_accepts_maximum` | method | `tests/test_security.py:62` | `def test_validate_size_accepts_maximum(self)` |
| `test_validate_size_rejects_oversized_files` | method | `tests/test_security.py:58` | `def test_validate_size_rejects_oversized_files(self)` |
| `TestEncodeOutputValidation` | class | `tests/test_zip.py:100` | `class TestEncodeOutputValidation` |
| `TestSecurityValidatorUnchanged` | class | `tests/test_zip.py:118` | `class TestSecurityValidatorUnchanged` |
| `TestZipRoundtrip` | class | `tests/test_zip.py:12` | `class TestZipRoundtrip` |
| `TestZipSecurity` | class | `tests/test_zip.py:67` | `class TestZipSecurity` |
| `_make_source_dir` | method | `tests/test_zip.py:20` | `def _make_source_dir(self, tmpdir)` |
| `setup` | method | `tests/test_zip.py:16` | `def setup(self)` |
| `setup` | method | `tests/test_zip.py:71` | `def setup(self)` |
| `setup` | method | `tests/test_zip.py:104` | `def setup(self)` |
| `setup` | method | `tests/test_zip.py:122` | `def setup(self)` |
| `test_create_and_extract_zip_roundtrip` | method | `tests/test_zip.py:53` | `def test_create_and_extract_zip_roundtrip(self)` |
| `test_encode_rejects_output_path_traversal` | method | `tests/test_zip.py:108` | `def test_encode_rejects_output_path_traversal(self)` |
| `test_extract_zip_blocks_path_traversal` | method | `tests/test_zip.py:75` | `def test_extract_zip_blocks_path_traversal(self)` |
| `test_extract_zip_blocks_uncompressed_bomb` | method | `tests/test_zip.py:88` | `def test_extract_zip_blocks_uncompressed_bomb(self)` |
| `test_rejects_traversal` | method | `tests/test_zip.py:126` | `def test_rejects_traversal(self)` |
| `test_sanitizes_filename` | method | `tests/test_zip.py:130` | `def test_sanitizes_filename(self)` |
| `test_zip_to_video_roundtrip_secure` | method | `tests/test_zip.py:33` | `def test_zip_to_video_roundtrip_secure(self)` |
| `get_wsgi_app` | function | `wsgi_app.py:7` | `def get_wsgi_app()` |
