tmux
tmux is a free and open-source terminal multiplexer designed for Unix-like operating systems, enabling users to create, access, and control multiple terminal sessions from a single screen.[1] It allows sessions to be detached from the display and continue running in the background, with the option to reattach later, making it particularly useful for remote work or long-running processes.[2] The tool operates on a client-server model, where a server manages sessions, windows, and panes, while clients connect via a socket to interact with them.[2] Developed by Nicholas Marriott, tmux was first released in 2007 as a modern alternative to the GNU Screen utility, initially created for the OpenBSD operating system.[3] It has since become widely adopted across various platforms, including FreeBSD, NetBSD, Linux, macOS, and Solaris, due to its lightweight design and extensibility.[1] The project is maintained on GitHub, with contributions from the community, and is distributed under the ISC license, which permits broad use and modification.[1][4] Key features of tmux include sessions, each containing multiple windows that can be split into resizable panes for simultaneous command execution.[2] Users interact with tmux through a default prefix key combination ofCtrl-b followed by commands, such as creating new windows (c), splitting panes (% for horizontal, " for vertical), or detaching sessions (d).[5] Configuration is handled via files like ~/.tmux.conf, allowing customization of key bindings, status bars, and themes to enhance productivity.[2] Its scripting capabilities and support for UTF-8 output further make it a versatile tool for developers and system administrators managing complex terminal environments.[2]
History and Development
Origins and Initial Release
tmux was developed by Nicholas Marriott, a developer associated with the OpenBSD project, as a free and open-source terminal multiplexer intended to address limitations in existing tools.[6] Marriott's initial motivation stemmed from his extensive use of GNU Screen, which he found cumbersome and insufficiently scriptable for his needs on BSD systems. He sought to create a lightweight, more flexible alternative that could better support scripting and integration within Unix-like environments, particularly those emphasizing simplicity and security like OpenBSD. A prototype was developed over several months, leading to the tool's maturation into a viable option for terminal management.[7] The first public release of tmux, version 1.0, took place on November 20, 2007, under the ISC license, making it freely available for modification and redistribution while aligning with BSD's permissive licensing philosophy.[7][6][1] Early adoption was concentrated within the OpenBSD community, where tmux was officially imported into the base system in July 2009, reflecting its alignment with OpenBSD's focus on clean, audited software. From there, it expanded to other Unix-like systems, including FreeBSD, NetBSD, and Linux distributions, due to its portability and compatibility with standard terminal protocols.[8]Key Milestones and Versions
tmux's development has been characterized by steady enhancements to its core multiplexing capabilities, with major versions introducing pivotal features that improved usability and compatibility. Version 1.5, released in January 2011, marked a significant advancement by introducing panes, enabling users to divide windows into multiple resizable sections for concurrent program execution within a single terminal view. Subsequent releases built on this foundation. Version 1.6, arriving later in 2011, added support for toggling between vi and emacs key binding modes, allowing customization to match users' preferred editing paradigms. In 2012, version 1.8 enhanced UTF-8 character handling, ensuring robust support for multilingual text and better integration with modern terminals. The 2.0 release in March 2015 refined the client-server architecture, streamlining mouse interactions with a unified option and expanding format variables for more dynamic status lines and configurations. Version 3.0, launched in May 2019, overhauled the layout engine to support lazy resizing of panes and incorporated regular expression matching in format expansions, alongside features like OSC 7 directory tracking for improved navigation. Later updates focused on reliability and efficiency. Version 3.3, released in June 2022, addressed key security vulnerabilities, including fixes for potential buffer overflows in command parsing. The 3.4 version in February 2024 introduced performance optimizations, such as optimized SIXEL image support and enhanced access control lists for multi-user environments. Key adoption milestones included tmux's packaging for Ubuntu in late 2009 with version 1.3, accelerating its uptake in Linux ecosystems, and its availability via Homebrew on macOS starting around 2010, broadening accessibility for developers on Apple platforms.[9] As of November 2025, tmux remains under active maintenance by primary developer Nicholas Marriott and a community of contributors through the project's GitHub repository, with the latest stable release being 3.5a—a minor patch from October 2024 that includes extended key support and UI refinements.[10] The software has consistently been licensed under the ISC terms since its inception, benefiting from foundational contributions by the OpenBSD project that emphasized secure and portable design.[11][8][1]Core Concepts and Functionality
Sessions, Windows, and Panes
tmux organizes terminal environments through a hierarchical structure consisting of sessions, windows, and panes, enabling users to manage multiple independent workspaces within a single terminal multiplexer server.[2] At the core of this system is the tmux server, which can host multiple sessions, each acting as a top-level container for related terminal activities.[12] A session serves as the primary unit of organization in tmux, encapsulating one or more windows and providing a persistent environment that can be detached from and reattached to by clients, allowing work to continue uninterrupted even if the connection is lost.[2] Each session is identified by a unique name, which defaults to a numeric value but can be customized for clarity, and it maintains its state independently of other sessions on the same server.[12] This design supports running multiple independent sessions simultaneously, such as one for development and another for monitoring, all managed by the tmux server.[2] Within a session, windows function as tab-like entities, each representing a single, full-screen view that can host a shell or program and is linked exclusively to that session.[2] Windows are indexed numerically starting from zero and can be named to reflect their purpose, facilitating quick switching between them to organize different tasks or projects.[12] A session typically contains multiple windows, allowing users to alternate between contexts without disrupting ongoing processes.[2] Panes introduce further subdivision by splitting a window into multiple rectangular regions, each operating as an independent pseudo-terminal for running separate commands or applications side-by-side or stacked.[2] Splits can be horizontal or vertical, enabling flexible layouts such as dividing a window into two vertical panes for editing code while viewing output in the adjacent one.[12] Each pane within a window is numbered sequentially and maintains its own focus, with only one active pane per window at any time.[2] The hierarchy in tmux is strictly defined: a single server oversees multiple sessions, each session encompasses multiple windows, and each window comprises one or more panes, creating a nested structure that scales from broad organizational units to granular terminal instances.[2] Visually, this structure is represented by a status bar at the bottom of the screen, which displays the current session name, a list of windows with indicators for the active and last-used ones, and details like the active pane's title.[12] Panes are delineated by borders, with the active pane highlighted—often by a distinct color like green—and resize handles along the borders allowing adjustment of their dimensions.[2]Multiplexing and Detachment
tmux employs a client-server architecture to facilitate terminal multiplexing, where the tmux server process manages all sessions, windows, and panes as a daemon running in the background.[2] Clients, which are separate processes, connect to this server via Unix domain sockets, typically located in a directory such as/tmp/tmux-<UID> where <UID> is the user's numeric identifier, ensuring per-user isolation by default.[2] This model allows the server to persist independently of any attached clients, handling input, output, and state synchronization across connected terminals.[12]
The multiplexing capability of tmux enables multiple clients to attach simultaneously to the same session, permitting users to view and interact with the shared environment from different terminals or even remote machines.[2] For instance, in a multi-user setup, a shared socket path can be specified with appropriate permissions to allow collaborative access, while pane synchronization modes ensure that input is duplicated across multiple panes within a window for coordinated operations.[2] This architecture supports load balancing across displays by distributing session views without duplicating the underlying processes.
Detachment in tmux allows users to disconnect a client from a running session, leaving the server and all associated programs active in the background, which is particularly valuable for maintaining long-running tasks.[12] Reattachment reconnects the client to the existing session via the same socket, preserving the full state including window layouts and pane contents, even across different terminal emulators or network connections.[2] In multi-user environments, socket paths like /tmp/tmux-<UID>/default facilitate secure, user-specific access, with options to detach other clients during reattachment to avoid conflicts.[2]
Common use cases for tmux's multiplexing and detachment include persistent remote work sessions over SSH, where network interruptions do not terminate processes, and collaborative development environments that enable multiple developers to monitor or contribute to the same session from various locations.[12] This setup also supports load balancing by allowing a single session to be accessed from multiple displays, optimizing resource use without redundant computations.
For error handling, tmux provides session locking mechanisms to secure inactive sessions after a configurable timeout, preventing unauthorized access via commands that invoke external lock programs.[2] While the server persists sessions during client detachments, reattachment remains possible as long as the server is running; if the server terminates unexpectedly, clients can attempt reconnection upon server restart, though session state is not automatically recovered without additional configuration.[2]
Configuration and Customization
Configuration File Syntax
The tmux configuration file, typically namedtmux.conf, allows users to customize the behavior of tmux sessions, windows, and panes through a series of commands and options. By default, tmux loads the system-wide configuration from @SYSCONFDIR@/tmux.conf (commonly /etc/tmux.conf on Unix-like systems) if it exists, followed by the user-specific file at ~/.tmux.conf or $XDG_CONFIG_HOME/tmux/tmux.conf as per the XDG Base Directory specification.[2] These files are read automatically when the tmux server starts, enabling persistent customizations across sessions.
The syntax of the configuration file consists primarily of tmux commands, each on its own line or separated by semicolons (;), with support for comments starting with an unquoted # and line continuations using \. Commands are often prefixed with set-option (or its shorthand set) for setting options in key-value format, such as set-option -g status-bg colour0 to change the global status bar background color, or set-window-option -g mode-keys [vi](/page/VI) (shorthand setw -g mode-keys [vi](/page/VI)) to enable Vi-style key bindings for copy mode on all windows.[2] Key bindings are defined using bind-key (shorthand bind), while includes are handled via source-file to load additional configuration files, e.g., source-file /path/to/extra.conf. Conditionals are supported through directives like if-shell, which executes commands based on shell command results, such as if-shell "test -n '$SSH_CONNECTION'" "set -g status-bg red" "set -g status-bg green".[2]
Options in the configuration are parsed with scopes: global (-g) applies server-wide, window-specific (-w) to all windows, and pane-specific options via set-pane-option (setp). The system-wide file is processed before the user file, with later settings overriding earlier ones in case of conflicts, ensuring user preferences take precedence.[2] To apply changes without restarting the server, use tmux source-file ~/.tmux.conf from within a session or bind it to a key for quick reloading.[2]
Common pitfalls in configuration include improper escaping of quotes and special characters in strings, where single (') or double (") quotes are used to enclose arguments containing spaces or shell metacharacters, and backslashes (\) escape sequences like \; for semicolons in command sequences. Additionally, commands like run-shell that invoke external shell scripts require careful quoting to avoid interpretation issues, as the configuration is parsed directly by tmux rather than a shell unless explicitly run externally.[2]
Key Bindings and Commands
Tmux employs a prefix key mechanism to distinguish its commands from those of the underlying applications, enabling efficient interaction within sessions. The default prefix key isCtrl-b, which must be pressed before most command keys to invoke tmux functionality.[2] This can be customized by using the set-option command, such as set -g [prefix](/page/Prefix) C-a to change it to Ctrl-a, allowing users to rebind the old prefix if desired with unbind C-b.[2] To send the prefix key literally to the active application, users can press the prefix key twice in quick succession, as in C-b C-b.[2]
Command modes in tmux provide structured ways to execute operations interactively. The command prompt is accessed by pressing the prefix followed by :, opening a prompt at the bottom of the screen where full tmux commands can be entered, such as split-window for horizontal pane division.[2] Copy mode, entered with prefix followed by [, allows navigation and selection of text within panes using either Emacs or vi-style key bindings, depending on the mode-keys option.[2] Similarly, search within copy mode uses / for forward searches or ? for backward, with highlighting controlled by options like copy-mode-match-style.[2]
Key bindings can be customized extensively to streamline navigation and control, using the bind-key command to associate keys with actions, optionally without the prefix via the -n flag. For instance, bind-key C-c new-window creates a new window upon Ctrl-c (with prefix), while bind-key -n C-c new-window omits the prefix requirement.[2] To revert to defaults, unbind-key removes specific bindings, such as unbind-key C-c, and bindings are organized into named tables like prefix or root for targeted overrides.[2] Essential default bindings include C-b c for creating a new window and C-b % for splitting a pane vertically, with horizontal splits via C-b ".[2] Repeatable bindings, marked with -r, allow actions like pane resizing by holding the key, controlled by the repeat-time option (default 500 ms).[2]
Tmux supports flexible input modes for enhanced usability in copy and search operations. By default, mode-keys is set to emacs, enabling arrow keys and Ctrl combinations for navigation, but it can be switched to vi with set -g mode-keys vi for h/j/k/l movement and y to copy selections.[2] The command prompt follows status-keys, similarly configurable to vi or emacs.[2] Mouse integration is enabled via set -g mouse on, permitting clicks to select panes, drags to resize, and wheel scrolling for navigation, with right-clicks accessing a context menu.[2]
For automation and scripting, tmux provides a command-line interface that mirrors interactive commands, facilitating programmatic control outside of sessions. The tmux executable can create detached sessions with tmux new-session -d -s mysession, allowing background operations before attachment.[2] Commands like send-keys can then target sessions, e.g., tmux send-keys -t mysession "ls" Enter, enabling scripted workflows integrated with shell scripts or configuration files.[2]
Usage and Commands
Basic Operations
Tmux provides a straightforward set of commands for initiating and managing basic sessions, enabling users to multiplex terminals efficiently. To start a new tmux session, the commandtmux new-session (or its alias tmux new) is used, which by default creates a session named "0" containing a single window running the user's default shell.[2] Alternatively, tmux alone invokes the same default behavior.[12] To reattach to a previously detached or running session, execute tmux attach-session (or tmux attach), optionally specifying the target session with the -t flag, such as tmux attach -t mysession.[2]
Navigation within tmux relies on the default prefix key, Ctrl-b (abbreviated as C-b), which precedes most key bindings to distinguish tmux commands from shell input. To create a new window in the current session, press C-b followed by c; this opens a fresh window with the default shell while preserving the existing one.[2] Switching between windows is achieved with C-b p for the previous window or C-b n for the next; windows are indexed starting from 0 and can also be selected directly using C-b followed by a digit (0-9).[12] For pane navigation, after entering the prefix, use the arrow keys (Up, Down, Left, Right) to move focus to an adjacent pane in the current window.[2]
Splitting the current pane allows multiple views within a single window. Pressing C-b % performs a horizontal split, creating left and right panes via the split-window -h command.[2] Conversely, C-b " executes a vertical split, creating top and bottom panes with the default split-window behavior.[2] Resizing panes is handled by combining the prefix with Ctrl and an arrow key: for example, C-b Ctrl-Right resizes the current pane one cell to the right, while similar bindings apply for other directions (Ctrl-Left, Ctrl-Up, Ctrl-Down).[2] These adjustments allow fine-tuned layout control without leaving the tmux environment.
To end elements of a tmux session, specific bindings and commands are available. Killing the current window prompts confirmation with C-b &, invoking the kill-window command.[2] Closing a pane can be done by typing exit within it to terminate the shell process, or via C-b x, which confirms and executes kill-pane.[12] From outside tmux, the entire session is terminated using tmux kill-session, optionally targeting a specific session with -t.[2]
The status line in tmux appears by default at the bottom of the screen in a green bar, displaying essential information such as the session name (e.g., ), the list of windows with the active one highlighted (e.g., 0:bash*), the hostname, and the current date and time.[12] This line provides quick orientation and can be toggled on or off by entering command mode (C-b :) and running set -g status off or set -g status on.[2]
Advanced Features
Tmux offers several advanced capabilities that enhance its utility for power users, particularly through extensibility via plugins, automation scripting, and seamless integrations with other tools. These features allow for customized workflows, persistent environments, and efficient management of complex terminal setups. One key extension is the tmux plugin manager (TPM), which simplifies the installation and management of third-party plugins. TPM is installed by cloning its repository withgit clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm and adding set -g @plugin 'tmux-plugins/tpm' followed by run '~/.tmux/plugins/tpm/tpm' to the ~/.tmux.conf file; reloading the configuration with tmux source-file ~/.tmux.conf then enables plugin fetching via the key binding prefix + I. A popular plugin managed by TPM is tmux-resurrect, which persists tmux environments across system restarts by saving sessions, windows, panes, layouts, and even running programs to a file (default: ~/.tmux/resurrect/last), restorable with the default key binding prefix + Ctrl-r; saving is triggered by prefix + Ctrl-s. This plugin requires tmux 1.9 or later and supports optional restoration of Vim or Neovim sessions if configured.
Scripting in tmux enables automated workflows through commands like send-keys and run-shell, integrated directly in shell scripts or the configuration file. The send-keys command sends keystrokes to a target pane, with syntax send-keys [-t target-pane] key ..., such as tmux send-keys -t session:window.pane 'ls' Enter to execute a command remotely; this is useful for automating input in detached sessions. Complementing this, run-shell executes arbitrary shell commands, with syntax run-shell [-b] [-t target-pane] shell-command, for instance run-shell 'command | tee log.txt' to log output from a pane while displaying it, facilitating tasks like monitoring long-running processes or batch operations across multiple panes.
Integrations with external tools further extend tmux's functionality. For seamless copy-paste with Vim, the vim-tmux-clipboard plugin automatically synchronizes yanked text from Vim to tmux's buffer and vice versa, requiring set -g focus-events on in ~/.tmux.conf and the companion vim-tmux-focus-events plugin for multi-process sharing within a session. Over SSH, tmux provides multiplexing by maintaining detachable sessions on remote hosts, allowing users to reconnect without losing state—start a session with ssh user@host tmux new-session -d -s mysession, then attach locally via ssh user@host tmux attach -t mysession. With Docker for container orchestration, tmux can manage multiple containers in panes (e.g., tmux split-window 'docker exec -it container1 [bash](/page/Bash)'), though running tmux inside containers typically requires an SSH server or pseudo-TTY allocation like docker run -it --rm -e TERM=xterm-256color image tmux.
Pane synchronization and navigation commands support collaborative or parallel workflows. The synchronize-panes option, toggled with setw synchronize-panes on (or off to disable), broadcasts input from the active pane to all panes in the window, ideal for running identical commands across environments like different code versions. For cycling through panes, select-pane -t :.+ advances to the next pane in order, bindable in ~/.tmux.conf as bind-key -r Tab select-pane -t :.+ for quick navigation.
Additional extensions include true color support and focus event handling. To enable true color (24-bit RGB), configure set -g default-terminal "tmux-256color" and set -ga terminal-overrides ",xterm-256color:Tc" in ~/.tmux.conf, ensuring the outer terminal supports the Tc capability for accurate color rendering in applications like Neovim. Focus events, enabled globally with set -g focus-events on, notify integrated editors (e.g., Vim or IDE terminals) of window focus changes, triggering autocommands like syntax highlighting updates or cursor styling without additional plugins in modern versions.
Availability and Ports
Supported Platforms
tmux was originally developed for OpenBSD, where it has been included in the base system since version 4.6, providing native support without additional installation requirements.[1] It also offers native support on other BSD variants, including FreeBSD, NetBSD, and Solaris, through their respective ports collections or base system integrations. On Linux, tmux is widely available across all major distributions, such as Debian, Ubuntu, Fedora, and Arch Linux, typically via standard package managers like apt, dnf, or pacman, ensuring seamless integration on x86_64 and ARM architectures.[13] Ports of tmux extend its availability to additional platforms. On macOS, it can be installed via package managers like Homebrew (brew install tmux) or MacPorts (port install tmux), with full compatibility including ARM64 support for Apple Silicon devices such as M1, M2, and M3 Macs. For Windows, there is no official native binary; instead, tmux runs through Unix-like environments like Windows Subsystem for Linux (WSL), Cygwin, or MSYS2, which provide the necessary POSIX compatibility. Support is available for mobile platforms: on Android, tmux is available via Termux, a terminal emulator that installs it as a package; on iOS, similar functionality is achievable through apps like iSH or third-party Termux ports, though these are not officially endorsed and may have limitations.[13][14][15]
tmux requires a Unix-like terminal environment and is optimized for terminals supporting at least 256 colors, such as those emulating xterm-256color or tmux-256color. It depends on libraries like libevent 2.x for event handling and ncurses for terminal manipulation, contributing to its minimal resource footprint—the compiled binary typically measures under 1 MB, making it suitable for resource-constrained systems. On Windows, compatibility issues arise with the legacy Console Host in versions prior to Windows 10; users are advised to use the modern Windows Terminal for proper color and key handling support. As of 2025, tmux provides full ARM64 compatibility, including native builds for Raspberry Pi devices running Raspberry Pi OS and optimized installations on Apple Silicon via Homebrew, without requiring cross-compilation in most cases. There remains no official native Windows binary, relying instead on subsystem ports.[1][16][17]
Installation Methods
tmux can be installed on various Unix-like systems using native package managers, which provide pre-built binaries for quick deployment. On Debian-based distributions such as Ubuntu, the Advanced Package Tool (APT) is used by runningsudo apt update followed by [sudo](/page/Sudo) apt install tmux.[13] For Red Hat-based systems like Fedora, the DNF package manager handles installation with [sudo](/page/Sudo) dnf install tmux.[13] On RHEL or CentOS (version 8 and later), the DNF package manager is used via [sudo](/page/Sudo) dnf install tmux; on older versions, YUM can be employed with [sudo](/page/Sudo) yum install tmux.[13] Arch Linux users utilize the Pacman package manager with [sudo](/page/Sudo) pacman -S tmux.[13]
On macOS, tmux is available through popular package managers. Homebrew users can install it by first ensuring Homebrew is updated with brew update and then executing brew install tmux.[13] Alternatively, MacPorts supports tmux installation via sudo port install tmux.
For BSD variants, installation methods vary by system. On FreeBSD, the PKG package manager installs tmux with sudo pkg install sysutils/tmux.[6] OpenBSD includes tmux as part of its base system since version 4.6, requiring no additional installation for modern releases; for older versions, pkg_add tmux was used.[18]
Building tmux from source allows for customization and access to the latest development features, requiring dependencies like libevent, ncurses, a C compiler, make, yacc or bison, and pkg-config, which are typically available via platform package managers. To build from the Git repository, clone it with git clone https://github.com/tmux/tmux, navigate to the directory, and run ./autogen.sh followed by ./configure && make && [sudo](/page/Sudo) make install.[13]
On Windows, tmux lacks native support but can be installed via the Windows Subsystem for Linux (WSL) by setting up a Linux distribution such as Ubuntu and using its package manager, for example sudo apt install tmux in Ubuntu on WSL. Alternatively, the Scoop package manager for Windows installs tmux with scoop install tmux after adding the main bucket if necessary.[19]
After installation on any platform, verify the setup by running tmux -V, which displays the installed version.[2]
Comparisons and Alternatives
Differences from GNU Screen
tmux and GNU Screen both serve as terminal multiplexers, but they differ significantly in their underlying architecture. tmux employs a client-server model where a single server process manages all sessions, windows, and panes, while separate client processes connect to the server via a Unix domain socket to access and control these elements.[11] This design allows multiple clients to attach to the same session simultaneously, enabling shared views of the session content by default, though users can link windows to achieve different current windows per client, similar to Screen's multiuser mode.[20] In contrast, GNU Screen operates as a single-process application per session, multiplexing multiple independent windows within that process without a distinct client-server separation, which limits concurrent access to one primary view per session unless configured for multiuser sharing.[21] A core distinction lies in window and pane management. tmux natively supports splitting a single window into multiple rectangular panes, each running its own pseudo-terminal, with commands likesplit-window for horizontal or vertical divisions and flexible resizing via key bindings such as holding Ctrl with directional arrows.[22] These panes allow for tiled layouts and synchronized commands across them, enhancing intra-window multitasking. GNU Screen, while supporting display splitting into regions (effectively panes) via the split command for horizontal (C-a S) and vertical (C-a |) divisions, traditionally treats splits as separate regions within a display rather than integrated panes per window, and its region management is less granular compared to tmux's pane indexing and styling options.[23]
Configuration in tmux offers greater flexibility through its ~/.tmux.conf file (or system-wide /etc/tmux.conf), supporting a wide array of set-option commands scoped to servers, sessions, windows, or panes, including global flags like -g for broad application.[24] This includes customizable styles, formats, and hooks for event-driven actions, with community extensions like plugin managers further enhancing modularity, though core functionality remains scriptable via commands. GNU Screen relies primarily on the .screenrc file for customization, using directives like bind for key mappings and screen for window definitions, but its scripting is more limited, lacking tmux's scoped options and hook system for advanced automation.[25]
Both tools handle UTF-8, but tmux integrates it more seamlessly, requiring a UTF-8-capable system and enabling it via the -u flag or automatic detection, with full support for mouse events and line drawing that falls back gracefully.[26] Screen supports UTF-8 through the -U option or utf8 command, setting it as the default encoding for new windows, though users may encounter configuration hurdles for consistent rendering.[27]
Users migrating from GNU Screen often adjust the default prefix key from C-a to tmux's C-b, configurable in .tmux.conf with set -g prefix C-a and related unbind/bind commands.[28] tmux's status line provides persistent information like window lists, differing from Screen's optional hardstatus and caption lines, which offer similar but less dynamically updatable displays without tmux's format expansions.[29]