Skip to content

Conversation

@codeflash-ai
Copy link
Contributor

@codeflash-ai codeflash-ai bot commented Jul 11, 2025

⚡️ This pull request contains optimizations for PR #537

If you approve this dependent PR, these changes will be merged into the original PR branch runtime-fixes-jul10.

This PR will be automatically closed if the original PR is merged.


📄 15% (0.15x) speedup for format_time in codeflash/code_utils/time_utils.py

⏱️ Runtime : 2.32 milliseconds 2.01 milliseconds (best of 147 runs)

📝 Explanation and details

Here is a faster and more memory efficient version of your code, re-written for optimal runtime and minimal temporary allocations.
The biggest optimizations are.

  • Avoid repeated f-string formatting per branch by leveraging intermediate integer math and tuple lookups.
  • Minimize float conversion and string formatting: use integer division and only format floats where necessary.
  • Avoid unnecessary chained if/else expressions by using nested conditionals.
  • Direct return, not temporary assignment, for common usage (early-out).
  • Minimize creation of temporary float objects (division is only triggered at last possible moment, and only when needed).

The result string is exactly as before.
Input type and value checks are retained as in the original.

Key speedups.

  • Uses integer division as long as possible (which is faster and avoids floats).
  • Avoids repeated float formatting and f-string interpolation: Only floats and formatting are used when output would need decimals.
  • No temporary assignments except where actually needed.
  • No nested ternaries to reduce overhead and branch ambiguity.

Result:
This version produces exactly the same outputs as the original, but should be significantly faster and use less memory (notably in the most common branch calls).
You can further accelerate by removing or altering input type checks if running in a controlled environment.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 82 Passed
🌀 Generated Regression Tests 5415 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 11 Passed
📊 Tests Coverage 100.0%
⚙️ Existing Unit Tests and Runtime
Test File::Test Function Original ⏱️ Optimized ⏱️ Speedup
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time 1.29μs 1.27μs ✅1.49%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_10 752ns 782ns ⚠️-3.84%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_11 2.25μs 2.29μs ⚠️-1.36%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_2 1.46μs 1.15μs ✅27.1%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_3 1.33μs 1.00μs ✅33.0%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_4 2.23μs 2.27μs ⚠️-1.80%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_5 2.12μs 2.09μs ✅1.43%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_6 2.03μs 2.09μs ⚠️-2.87%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_7 1.97μs 1.91μs ✅3.13%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_8 2.09μs 2.00μs ✅4.49%
codeflash_concolic_xz5acr_j/tmpb6zsgutb/test_concolic_coverage.py::test_format_time_9 2.02μs 2.26μs ⚠️-10.6%
test_humanize_time.py::TestFormatTime.test_boundary_values 5.66μs 5.48μs ✅3.30%
test_humanize_time.py::TestFormatTime.test_invalid_input_types 4.47μs 4.51μs ⚠️-0.887%
test_humanize_time.py::TestFormatTime.test_large_values 2.23μs 2.00μs ✅11.5%
test_humanize_time.py::TestFormatTime.test_microseconds_range 5.85μs 5.70μs ✅2.63%
test_humanize_time.py::TestFormatTime.test_milliseconds_range 7.08μs 6.81μs ✅3.91%
test_humanize_time.py::TestFormatTime.test_nanoseconds_range 1.87μs 1.93μs ⚠️-3.10%
test_humanize_time.py::TestFormatTime.test_negative_values 2.25μs 2.24μs ✅0.446%
test_humanize_time.py::TestFormatTime.test_parametrized_examples 18.4μs 18.0μs ✅2.22%
test_humanize_time.py::TestFormatTime.test_precision_boundaries 9.59μs 10.1μs ⚠️-4.85%
test_humanize_time.py::TestFormatTime.test_rounding_behavior 7.48μs 7.46μs ✅0.281%
test_humanize_time.py::TestFormatTime.test_seconds_range 7.45μs 8.23μs ⚠️-9.49%
🌀 Generated Regression Tests and Runtime
from __future__ import annotations

# imports
import pytest  # used for our unit tests
from codeflash.code_utils.time_utils import format_time

# unit tests

# -------------------------------
# BASIC TEST CASES
# -------------------------------

def test_format_time_ns_range():
    # Test values strictly in the nanoseconds range (< 1_000)
    codeflash_output = format_time(0) # 811ns -> 742ns (9.30% faster)
    codeflash_output = format_time(1) # 421ns -> 440ns (4.32% slower)
    codeflash_output = format_time(999) # 310ns -> 321ns (3.43% slower)

def test_format_time_us_range():
    # Test values in the microseconds range (1_000 <= x < 1_000_000)
    # <10μs: 2 decimal places
    codeflash_output = format_time(1_000) # 2.19μs -> 2.17μs (0.920% faster)
    codeflash_output = format_time(9_999) # 1.09μs -> 1.04μs (4.80% faster)
    codeflash_output = format_time(5_432) # 672ns -> 641ns (4.84% faster)
    # <100μs: 1 decimal place
    codeflash_output = format_time(10_000) # 701ns -> 651ns (7.68% faster)
    codeflash_output = format_time(99_999) # 661ns -> 611ns (8.18% faster)
    codeflash_output = format_time(54_321) # 571ns -> 541ns (5.55% faster)
    # >=100μs: integer
    codeflash_output = format_time(100_000) # 641ns -> 461ns (39.0% faster)
    codeflash_output = format_time(999_999) # 561ns -> 451ns (24.4% faster)

def test_format_time_ms_range():
    # Test values in the milliseconds range (1_000_000 <= x < 1_000_000_000)
    # <10ms: 2 decimal places
    codeflash_output = format_time(1_000_000) # 2.05μs -> 2.06μs (0.484% slower)
    codeflash_output = format_time(9_999_999) # 972ns -> 881ns (10.3% faster)
    codeflash_output = format_time(5_432_100) # 621ns -> 601ns (3.33% faster)
    # <100ms: 1 decimal place
    codeflash_output = format_time(10_000_000) # 661ns -> 621ns (6.44% faster)
    codeflash_output = format_time(99_999_999) # 571ns -> 570ns (0.175% faster)
    codeflash_output = format_time(54_321_000) # 541ns -> 531ns (1.88% faster)
    # >=100ms: integer
    codeflash_output = format_time(100_000_000) # 561ns -> 441ns (27.2% faster)
    codeflash_output = format_time(999_999_999) # 521ns -> 431ns (20.9% faster)

def test_format_time_s_range():
    # Test values in the seconds range (>= 1_000_000_000)
    # <10s: 2 decimal places
    codeflash_output = format_time(1_000_000_000) # 1.98μs -> 1.89μs (4.75% faster)
    codeflash_output = format_time(9_999_999_999) # 1.17μs -> 1.44μs (18.8% slower)
    codeflash_output = format_time(5_432_100_000) # 672ns -> 802ns (16.2% slower)
    # <100s: 1 decimal place
    codeflash_output = format_time(10_000_000_000) # 691ns -> 791ns (12.6% slower)
    codeflash_output = format_time(99_999_999_999) # 611ns -> 741ns (17.5% slower)
    codeflash_output = format_time(54_321_000_000) # 561ns -> 641ns (12.5% slower)
    # >=100s: integer
    codeflash_output = format_time(100_000_000_000) # 581ns -> 551ns (5.44% faster)
    codeflash_output = format_time(999_999_999_999) # 551ns -> 531ns (3.77% faster)

# -------------------------------
# EDGE TEST CASES
# -------------------------------

def test_format_time_type_errors():
    # Test that non-integer input raises TypeError
    with pytest.raises(TypeError):
        format_time(1.5) # 2.31μs -> 2.29μs (0.872% faster)
    with pytest.raises(TypeError):
        format_time("1000") # 1.19μs -> 1.23μs (3.25% slower)
    with pytest.raises(TypeError):
        format_time(None) # 892ns -> 922ns (3.25% slower)
    with pytest.raises(TypeError):
        format_time([1000]) # 912ns -> 901ns (1.22% faster)

def test_format_time_negative_values():
    # Test that negative input raises ValueError
    with pytest.raises(ValueError):
        format_time(-1) # 1.80μs -> 1.75μs (2.91% faster)
    with pytest.raises(ValueError):
        format_time(-1000000) # 1.08μs -> 1.07μs (0.933% faster)

def test_format_time_boundary_transitions():
    # Check formatting at exact boundaries between units
    codeflash_output = format_time(999) # 731ns -> 711ns (2.81% faster)
    codeflash_output = format_time(1_000) # 1.81μs -> 1.90μs (4.73% slower)
    codeflash_output = format_time(999_999) # 771ns -> 570ns (35.3% faster)
    codeflash_output = format_time(1_000_000) # 842ns -> 921ns (8.58% slower)
    codeflash_output = format_time(999_999_999) # 551ns -> 480ns (14.8% faster)
    codeflash_output = format_time(1_000_000_000) # 641ns -> 741ns (13.5% slower)

def test_format_time_rounding_behavior():
    # Test rounding at cutoff points
    codeflash_output = format_time(1_234) # 2.04μs -> 2.00μs (2.05% faster)
    codeflash_output = format_time(1_235) # 1.16μs -> 1.13μs (2.74% faster)
    codeflash_output = format_time(12_345) # 731ns -> 671ns (8.94% faster)
    codeflash_output = format_time(123_456) # 591ns -> 440ns (34.3% faster)
    codeflash_output = format_time(1_234_567) # 711ns -> 772ns (7.90% slower)
    codeflash_output = format_time(12_345_678) # 592ns -> 601ns (1.50% slower)
    codeflash_output = format_time(123_456_789) # 531ns -> 451ns (17.7% faster)
    codeflash_output = format_time(1_234_567_890) # 792ns -> 1.16μs (31.8% slower)
    codeflash_output = format_time(12_345_678_901) # 621ns -> 741ns (16.2% slower)
    codeflash_output = format_time(123_456_789_012) # 491ns -> 511ns (3.91% slower)

def test_format_time_large_integer():
    # Test very large integer input (beyond seconds)
    codeflash_output = format_time(10**12) # 1.41μs -> 1.33μs (6.08% faster)
    codeflash_output = format_time(9_999_999_999_999) # 631ns -> 681ns (7.34% slower)
    codeflash_output = format_time(123_456_789_012_345) # 531ns -> 501ns (5.99% faster)

def test_format_time_zero():
    # Test zero input (should be '0ns')
    codeflash_output = format_time(0) # 681ns -> 701ns (2.85% slower)

# -------------------------------
# LARGE SCALE TEST CASES
# -------------------------------

def test_format_time_bulk_microseconds():
    # Test a range of values in microseconds range for correct formatting
    for ns in range(1_000, 1_000_000, 10_000):  # 0.001ms to 1ms in steps
        codeflash_output = format_time(ns); result = codeflash_output # 45.6μs -> 37.0μs (23.1% faster)
        # Should never have more than 2 decimal places
        if '.' in result:
            decimals = result.split('μ')[0].split('.')[-1]

def test_format_time_bulk_milliseconds():
    # Test a range of values in milliseconds range for correct formatting
    for ns in range(1_000_000, 1_000_000_000, 10_000_000):  # 1ms to 1s
        codeflash_output = format_time(ns); result = codeflash_output # 44.1μs -> 36.1μs (22.0% faster)
        if '.' in result:
            decimals = result.split('m')[0].split('.')[-1]

def test_format_time_bulk_seconds():
    # Test a range of values in seconds range for correct formatting
    for ns in range(1_000_000_000, 1_000_000_000_000, 10_000_000_000):  # 1s to 1000s
        codeflash_output = format_time(ns); result = codeflash_output # 47.3μs -> 43.4μs (8.82% faster)
        if '.' in result:
            decimals = result.split('s')[0].split('.')[-1]

def test_format_time_performance_large_inputs():
    # Test with the largest allowed input (just under 1_000_000_000_000)
    # to ensure function does not crash or slow down
    big_ns = 999_999_999_999
    codeflash_output = format_time(big_ns); result = codeflash_output # 1.42μs -> 1.26μs (12.8% faster)

def test_format_time_all_units_coverage():
    # Test that all units are covered in a batch
    samples = [
        (500, "500ns"),
        (50_000, "50.0μs"),
        (5_000_000, "5.00ms"),
        (500_000_000, "500ms"),
        (5_000_000_000, "5.00s"),
        (500_000_000_000, "500s"),
    ]
    for ns, expected in samples:
        codeflash_output = format_time(ns) # 5.60μs -> 5.80μs (3.47% slower)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.

from __future__ import annotations

# imports
import pytest  # used for our unit tests
from codeflash.code_utils.time_utils import format_time

# unit tests

# -------------------------
# Basic Test Cases
# -------------------------

def test_format_time_ns_range():
    # Test values strictly less than 1,000 (should be in ns)
    codeflash_output = format_time(0) # 691ns -> 711ns (2.81% slower)
    codeflash_output = format_time(1) # 420ns -> 430ns (2.33% slower)
    codeflash_output = format_time(999) # 331ns -> 331ns (0.000% faster)

def test_format_time_us_range():
    # Test values from 1,000 to 999,999 (should be in μs)
    # <10μs: 2 decimal places
    codeflash_output = format_time(1_000) # 2.14μs -> 2.19μs (2.28% slower)
    codeflash_output = format_time(9_999) # 992ns -> 1.01μs (1.98% slower)
    codeflash_output = format_time(5_432) # 641ns -> 662ns (3.17% slower)
    # 10-99.9μs: 1 decimal place
    codeflash_output = format_time(10_000) # 721ns -> 661ns (9.08% faster)
    codeflash_output = format_time(99_999) # 652ns -> 630ns (3.49% faster)
    codeflash_output = format_time(55_555) # 561ns -> 561ns (0.000% faster)
    # >=100μs: integer
    codeflash_output = format_time(100_000) # 621ns -> 461ns (34.7% faster)
    codeflash_output = format_time(999_999) # 571ns -> 461ns (23.9% faster)

def test_format_time_ms_range():
    # Test values from 1_000_000 to 999_999_999 (should be in ms)
    # <10ms: 2 decimal places
    codeflash_output = format_time(1_000_000) # 2.07μs -> 2.09μs (1.00% slower)
    codeflash_output = format_time(9_999_999) # 992ns -> 1.00μs (0.899% slower)
    codeflash_output = format_time(5_432_100) # 601ns -> 581ns (3.44% faster)
    # 10-99.9ms: 1 decimal place
    codeflash_output = format_time(10_000_000) # 651ns -> 601ns (8.32% faster)
    codeflash_output = format_time(99_999_999) # 601ns -> 572ns (5.07% faster)
    codeflash_output = format_time(55_555_555) # 581ns -> 561ns (3.57% faster)
    # >=100ms: integer
    codeflash_output = format_time(100_000_000) # 541ns -> 431ns (25.5% faster)
    codeflash_output = format_time(999_999_999) # 541ns -> 431ns (25.5% faster)

def test_format_time_s_range():
    # Test values >= 1_000_000_000 (should be in s)
    # <10s: 2 decimal places
    codeflash_output = format_time(1_000_000_000) # 2.01μs -> 2.05μs (2.00% slower)
    codeflash_output = format_time(9_999_999_999) # 1.12μs -> 1.46μs (23.3% slower)
    codeflash_output = format_time(5_432_100_000) # 661ns -> 782ns (15.5% slower)
    # 10-99.9s: 1 decimal place
    codeflash_output = format_time(10_000_000_000) # 691ns -> 791ns (12.6% slower)
    codeflash_output = format_time(99_999_999_999) # 611ns -> 751ns (18.6% slower)
    codeflash_output = format_time(55_555_555_555) # 541ns -> 641ns (15.6% slower)
    # >=100s: integer
    codeflash_output = format_time(100_000_000_000) # 591ns -> 561ns (5.35% faster)
    codeflash_output = format_time(999_999_999_999) # 551ns -> 541ns (1.85% faster)

# -------------------------
# Edge Test Cases
# -------------------------

def test_format_time_type_errors():
    # Test non-integer input types
    with pytest.raises(TypeError):
        format_time(1.23) # 2.30μs -> 2.26μs (1.77% faster)
    with pytest.raises(TypeError):
        format_time("1000") # 1.18μs -> 1.18μs (0.000% faster)
    with pytest.raises(TypeError):
        format_time(None) # 902ns -> 952ns (5.25% slower)
    with pytest.raises(TypeError):
        format_time([1000]) # 922ns -> 892ns (3.36% faster)

def test_format_time_negative():
    # Test negative integer input
    with pytest.raises(ValueError):
        format_time(-1) # 1.79μs -> 1.79μs (0.000% faster)
    with pytest.raises(ValueError):
        format_time(-1000000) # 1.06μs -> 1.04μs (1.92% faster)

def test_format_time_boundary_values():
    # Test values exactly at the conversion boundaries
    codeflash_output = format_time(999) # 731ns -> 692ns (5.64% faster)
    codeflash_output = format_time(1_000) # 1.93μs -> 1.97μs (2.03% slower)
    codeflash_output = format_time(999_999) # 802ns -> 571ns (40.5% faster)
    codeflash_output = format_time(1_000_000) # 821ns -> 862ns (4.76% slower)
    codeflash_output = format_time(999_999_999) # 581ns -> 531ns (9.42% faster)
    codeflash_output = format_time(1_000_000_000) # 651ns -> 711ns (8.44% slower)

def test_format_time_rounding_behavior():
    # Test rounding at each precision boundary
    codeflash_output = format_time(1_234) # 2.13μs -> 2.09μs (1.91% faster)
    codeflash_output = format_time(12_345) # 902ns -> 901ns (0.111% faster)
    codeflash_output = format_time(123_456) # 642ns -> 501ns (28.1% faster)
    codeflash_output = format_time(1_234_567) # 741ns -> 761ns (2.63% slower)
    codeflash_output = format_time(12_345_678) # 631ns -> 621ns (1.61% faster)
    codeflash_output = format_time(123_456_789) # 481ns -> 410ns (17.3% faster)
    codeflash_output = format_time(1_234_567_890) # 832ns -> 1.16μs (28.4% slower)
    codeflash_output = format_time(12_345_678_900) # 621ns -> 741ns (16.2% slower)
    codeflash_output = format_time(123_456_789_000) # 471ns -> 501ns (5.99% slower)

def test_format_time_zero():
    # Test zero input
    codeflash_output = format_time(0) # 681ns -> 692ns (1.59% slower)

def test_format_time_large_integer_exact():
    # Test very large integer that is an exact multiple of 1_000_000_000
    codeflash_output = format_time(1_000_000_000_000) # 1.51μs -> 1.38μs (9.40% faster)

# -------------------------
# Large Scale Test Cases
# -------------------------

def test_format_time_many_ns_values():
    # Test all ns values from 0 to 999
    for ns in range(0, 1000):
        codeflash_output = format_time(ns) # 258μs -> 260μs (0.683% slower)

def test_format_time_many_us_values():
    # Test a sample of μs values across the range
    for ns in range(1000, 998000, 997):  # ~1000 steps
        us = ns / 1_000
        if us < 10:
            expected = f"{us:.2f}μs"
        elif us < 100:
            expected = f"{us:.1f}μs"
        else:
            expected = f"{int(us)}μs"
        codeflash_output = format_time(ns) # 427μs -> 342μs (25.1% faster)

def test_format_time_many_ms_values():
    # Test a sample of ms values across the range
    for ns in range(1_000_000, 1_000_000_000, 999_000):  # ~1000 steps
        ms = ns / 1_000_000
        if ms < 10:
            expected = f"{ms:.2f}ms"
        elif ms < 100:
            expected = f"{ms:.1f}ms"
        else:
            expected = f"{int(ms)}ms"
        codeflash_output = format_time(ns) # 427μs -> 340μs (25.5% faster)

def test_format_time_many_s_values():
    # Test a sample of s values across the range
    for ns in range(1_000_000_000, 1_000_000_000_000, 999_000_000):  # ~1000 steps
        s = ns / 1_000_000_000
        if s < 10:
            expected = f"{s:.2f}s"
        elif s < 100:
            expected = f"{s:.1f}s"
        else:
            expected = f"{int(s)}s"
        codeflash_output = format_time(ns) # 446μs -> 411μs (8.51% faster)

def test_format_time_large_randomized():
    # Test a variety of large values (not just boundaries)
    test_values = [
        987_654_321_012,
        123_456_789_012,
        999_999_999_999,
        500_000_000_000,
        1_234_567_890_123,
    ]
    for ns in test_values:
        s = ns / 1_000_000_000
        if s < 10:
            expected = f"{s:.2f}s"
        elif s < 100:
            expected = f"{s:.1f}s"
        else:
            expected = f"{int(s)}s"
        codeflash_output = format_time(ns) # 3.10μs -> 3.46μs (10.4% slower)

def test_format_time_performance_many_calls():
    # Test the function's performance with a large number of calls (no assertion, just ensure no exception)
    for ns in range(0, 1_000_000, 1000):  # 1000 calls
        format_time(ns) # 427μs -> 347μs (23.1% faster)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.

from codeflash.code_utils.time_utils import format_time
import pytest

def test_format_time():
    format_time(100000000000)

def test_format_time_2():
    format_time(100000)

def test_format_time_3():
    format_time(100000000)

def test_format_time_4():
    format_time(10000)

def test_format_time_5():
    format_time(1000)

def test_format_time_6():
    format_time(1000000000)

def test_format_time_7():
    format_time(1000000)

def test_format_time_8():
    format_time(10000000)

def test_format_time_9():
    format_time(10000000000)

def test_format_time_10():
    format_time(0)

def test_format_time_11():
    with pytest.raises(ValueError, match='Input\\ must\\ be\\ a\\ positive\\ integer\\.'):
        format_time(-1)

To edit these changes git checkout codeflash/optimize-pr537-2025-07-11T04.43.23 and push.

Codeflash

…jul10`)

Here is a **faster and more memory efficient version** of your code, re-written for optimal runtime and minimal temporary allocations.  
The biggest optimizations are.

- **Avoid repeated f-string formatting per branch by leveraging intermediate integer math and tuple lookups.**
- **Minimize float conversion and string formatting: use integer division and only format floats where necessary.**
- Avoid unnecessary chained if/else expressions by using nested conditionals.
- Direct return, not temporary assignment, for common usage (early-out).
- Minimize creation of temporary float objects (division is only triggered at last possible moment, and only when needed).

The result string is exactly as before.  
Input type and value checks are retained as in the original.



**Key speedups**.

- Uses integer division as long as possible (which is faster and avoids floats).
- Avoids repeated float formatting and f-string interpolation: Only floats and formatting are used when output would need decimals.
- No temporary assignments except where actually needed.
- No nested ternaries to reduce overhead and branch ambiguity.

**Result:**  
This version produces exactly the same outputs as the original, but should be significantly faster and use less memory (notably in the most common branch calls).  
You can further accelerate by removing or altering input type checks if running in a controlled environment.
@codeflash-ai codeflash-ai bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Jul 11, 2025
@codeflash-ai codeflash-ai bot closed this Jul 11, 2025
@codeflash-ai
Copy link
Contributor Author

codeflash-ai bot commented Jul 11, 2025

This PR has been automatically closed because the original PR #537 by aseembits93 was closed.

@codeflash-ai codeflash-ai bot deleted the codeflash/optimize-pr537-2025-07-11T04.43.23 branch July 11, 2025 04:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants