<pre style='margin:0'>
Zero King (l2dy) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/4a4f7ab7a22eeb33b59636a427f29dedc59721bd">https://github.com/macports/macports-ports/commit/4a4f7ab7a22eeb33b59636a427f29dedc59721bd</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 4a4f7ab  iTerm2: fix CVE-2019-9535
</span>4a4f7ab is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 4a4f7ab7a22eeb33b59636a427f29dedc59721bd
</span>Author: Zero King <l2dy@macports.org>
AuthorDate: Thu Oct 10 02:29:38 2019 +0000

<span style='display:block; white-space:pre;color:#404040;'>    iTerm2: fix CVE-2019-9535
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    The Mozilla Foundation has generously sponsored a security audit of the iTerm2
</span><span style='display:block; white-space:pre;color:#404040;'>    source code. As part of this audit, a problem was discovered which could cause
</span><span style='display:block; white-space:pre;color:#404040;'>    iTerm2 to issue commands in response to receiving certain input. This is a
</span><span style='display:block; white-space:pre;color:#404040;'>    serious security issue because in some circumstances it could allow an attacker
</span><span style='display:block; white-space:pre;color:#404040;'>    to execute commands on your machine when you view a file or otherwise receive
</span><span style='display:block; white-space:pre;color:#404040;'>    input they have crafted in iTerm2.
</span>---
 aqua/iTerm2/Portfile                       |    3 +
 aqua/iTerm2/files/patch-CVE-2019-9535.diff | 1840 ++++++++++++++++++++++++++++
 2 files changed, 1843 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/aqua/iTerm2/Portfile b/aqua/iTerm2/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 4848771..d8e9aa2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/aqua/iTerm2/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/aqua/iTerm2/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,6 +10,7 @@ if {[info exists use_xcode]} {
</span> 
 if {[vercmp ${os.version} 17.0.0] < 0} {
     version             3.2.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    revision            0
</span>     checksums \
         rmd160  07915ff5db0545c0c059f47e7f71761e023a26e1 \
         sha256  017aff348352369abcc994caaca0f6112e1f17c4d65041acdb9f19830b2b96bd \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -17,11 +18,13 @@ if {[vercmp ${os.version} 17.0.0] < 0} {
</span>     patchfiles          patch-Makefile.diff
 } else {
     version             3.3.5
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    revision            1
</span>     checksums \
         rmd160  612cb41be30fe2940bc300055afbb77938d4a19d \
         sha256  6ce9e5650fa4245fc5b702c58cdea43b6d3fe995abc7b52520377f840fd8a492 \
         size    18852672
     patchfiles          patch-Makefile-XC10.diff
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles-append   patch-CVE-2019-9535.diff
</span> }
 
 github.setup        gnachman iTerm2 ${version} v
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/aqua/iTerm2/files/patch-CVE-2019-9535.diff b/aqua/iTerm2/files/patch-CVE-2019-9535.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..0fd7e45
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/aqua/iTerm2/files/patch-CVE-2019-9535.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,1840 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 538d570ea54614d3a2b5724f820953d717fbeb0c Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: George Nachman <gln@whatsapp.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Wed, 25 Sep 2019 23:13:00 -0700
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Do not send server-controlled values in tmux integration
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mode.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CVE-2019-9535
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Use session number everywhere rather than session name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Do not poll tmux for the set-titles-string, status-left, and status-right and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  then request the values of the returned format strings. Use ${T:} eval
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  instead. These features are now only available for tmux 2.9 and later.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Hex-encode options saved in the tmux server to make them unexploitable (e.g.,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  hotkeys, window affinities, window origins, etc.). The old values are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  accepted as inputs but will never be produced as output.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ iTerm2.xcodeproj/project.pbxproj      |   8 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/PTYSession.m                  |  28 ++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/PTYTab.m                      |  13 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/PseudoTerminal.m              |   9 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxController.h              |  47 ++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxController.m              | 305 +++++++++++++++-----------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxDashboardController.m     | 163 +++++++-------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxSessionsTable.h           |  30 +--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxSessionsTable.m           | 106 ++++-----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxWindowsTable.h            |   2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/TmuxWindowsTable.m            |  21 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermInitialDirectory+Tmux.h  |   2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermInitialDirectory+Tmux.m  |  20 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermTmuxOptionMonitor.h      |   4 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermTmuxOptionMonitor.m      |  16 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermTmuxSessionObject.h      |  17 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermTmuxSessionObject.m      |  12 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermTmuxStatusBarMonitor.h   |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermTmuxStatusBarMonitor.m   |  28 +--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sources/iTermWorkingDirectoryPoller.m |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 20 files changed, 471 insertions(+), 362 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 sources/iTermTmuxSessionObject.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 sources/iTermTmuxSessionObject.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git iTerm2.xcodeproj/project.pbxproj iTerm2.xcodeproj/project.pbxproj
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7e2f86a..32e1df2 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- iTerm2.xcodeproj/project.pbxproj
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ iTerm2.xcodeproj/project.pbxproj
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1376,6 +1376,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E184F21FE32F2800DB78F3 /* iTermMetalBufferPool.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E184F01FE32F2800DB78F3 /* iTermMetalBufferPool.m */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E8F36F2244A58800F3770F /* iTermActionsModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 53E8F36D2244A58800F3770F /* iTermActionsModel.h */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E8F3702244A58800F3770F /* iTermActionsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E8F36E2244A58800F3770F /* iTermActionsModel.m */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          53E98E7B233C6B760094D8A9 /* iTermTmuxSessionObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 53E98E79233C6B760094D8A9 /* iTermTmuxSessionObject.h */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          53E98E7C233C6B760094D8A9 /* iTermTmuxSessionObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 53E98E7A233C6B760094D8A9 /* iTermTmuxSessionObject.m */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E9DFE0220D518E0070C9C0 /* AlertTrigger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D9DCC15142D7FC10016228A /* AlertTrigger.m */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E9DFE1220D51D50070C9C0 /* CoprocessTrigger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D9DDD91142E5AC600275650 /* CoprocessTrigger.m */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E9DFE2220D52730070C9C0 /* PasswordTrigger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DABA03219253FEA00A228D8 /* PasswordTrigger.m */; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4429,6 +4431,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E184F01FE32F2800DB78F3 /* iTermMetalBufferPool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermMetalBufferPool.m; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E8F36D2244A58800F3770F /* iTermActionsModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iTermActionsModel.h; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53E8F36E2244A58800F3770F /* iTermActionsModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermActionsModel.m; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          53E98E79233C6B760094D8A9 /* iTermTmuxSessionObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iTermTmuxSessionObject.h; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          53E98E7A233C6B760094D8A9 /* iTermTmuxSessionObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermTmuxSessionObject.m; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53EBF29B1DCBFF7C00766613 /* iTermAPIServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermAPIServer.h; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53EBF29C1DCBFF7C00766613 /* iTermAPIServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermAPIServer.m; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           53EBF29F1DCCF4AC00766613 /* iTermIPV4Address.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermIPV4Address.h; sourceTree = "<group>"; };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -7010,6 +7014,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A6F718B4226438FC0053488E /* iTermInitialDirectory+Tmux.m */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           53D68F7E2283EE7C0018710D /* iTermTmuxLayoutBuilder.h */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           53D68F7F2283EE7C0018710D /* iTermTmuxLayoutBuilder.m */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          53E98E79233C6B760094D8A9 /* iTermTmuxSessionObject.h */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          53E98E7A233C6B760094D8A9 /* iTermTmuxSessionObject.m */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   name = tmux;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   sourceTree = "<group>";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -9987,6 +9993,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A6153D4C21F30A9C002976FC /* iTermJobTreeViewController.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           5370678F21C9D2780088D0F3 /* SIGSHA2VerificationAlgorithm.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A66719161DCE36C3000CE608 /* NSURL+iTerm.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          53E98E7B233C6B760094D8A9 /* iTermTmuxSessionObject.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A66719171DCE36C3000CE608 /* NSDate+iTerm.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A6BCAAD821F6F53E0000CD29 /* iTermTextPopoverViewController.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A66719181DCE36C3000CE608 /* iTermBaseHotKey.h in Headers */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12429,6 +12436,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A6AC5D241E9036D70097C0A7 /* iTermURLMark.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           535EA51420D8C1EB00FC81E0 /* iTermProfilesWindowController.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A6A4866F20B67A1600493302 /* iTermSemanticHistoryPrefsController.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          53E98E7C233C6B760094D8A9 /* iTermTmuxSessionObject.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A66719621DCE3772000CE608 /* iTermSocketAddress.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           A6A4867E20B67FD100493302 /* SmartSelectionController.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           53AFFC8E1DD2A04100E6CEC6 /* iTermLSOF.m in Sources */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/PTYSession.m sources/PTYSession.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9b64e03..0332d8c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/PTYSession.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/PTYSession.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4726,7 +4726,7 @@ ITERM_WEAKLY_REFERENCEABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             // Legacy code path for pre tmux 2.6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [_tmuxController renameWindowWithId:_delegate.tmuxWindow
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                      inSession:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                inSessionNumber:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          toName:profile[KEY_NAME]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         _tmuxTitleOutOfSync = NO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5910,14 +5910,18 @@ scrollToFirstResult:(BOOL)scrollToFirstResult {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)installTmuxStatusBarMonitor {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert(!_tmuxStatusBarMonitor);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _tmuxStatusBarMonitor = [[iTermTmuxStatusBarMonitor alloc] initWithGateway:_tmuxController.gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                         scope:self.variablesScope];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _tmuxStatusBarMonitor.active = [iTermProfilePreferences boolForKey:KEY_SHOW_STATUS_BAR inProfile:self.profile];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if ([iTermPreferences boolForKey:kPreferenceKeyUseTmuxStatusBar] ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [iTermStatusBarLayout shouldOverrideLayout:self.profile[KEY_STATUS_BAR_LAYOUT]]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [self setSessionSpecificProfileValues:@{ KEY_STATUS_BAR_LAYOUT: [[iTermStatusBarLayout tmuxLayoutWithController:_tmuxController
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                                                                  scope:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                                                                 window:self.delegate.tmuxWindow] dictionaryValue] }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (_tmuxController.gateway.minimumServerVersion.doubleValue >= 2.9) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // Just use the built-in status bar for older versions of tmux because they don't support ${T:xxx} or ${E:xxx}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _tmuxStatusBarMonitor = [[iTermTmuxStatusBarMonitor alloc] initWithGateway:_tmuxController.gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                             scope:self.variablesScope];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _tmuxStatusBarMonitor.active = [iTermProfilePreferences boolForKey:KEY_SHOW_STATUS_BAR inProfile:self.profile];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if ([iTermPreferences boolForKey:kPreferenceKeyUseTmuxStatusBar] ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            [iTermStatusBarLayout shouldOverrideLayout:self.profile[KEY_STATUS_BAR_LAYOUT]]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            [self setSessionSpecificProfileValues:@{ KEY_STATUS_BAR_LAYOUT: [[iTermStatusBarLayout tmuxLayoutWithController:_tmuxController
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                                                                      scope:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                                                                     window:self.delegate.tmuxWindow] dictionaryValue] }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5929,7 +5933,8 @@ scrollToFirstResult:(BOOL)scrollToFirstResult {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     __weak __typeof(self) weakSelf = self;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _tmuxTitleMonitor = [[iTermTmuxOptionMonitor alloc] initWithGateway:_tmuxController.gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                 scope:self.variablesScope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                  scope:self.variablesScope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                   fallbackVariableName:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                 format:@"#{pane_title}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                 target:[NSString stringWithFormat:@"%%%@", @(self.tmuxPane)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                           variableName:iTermVariableKeySessionTmuxPaneTitle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6308,8 +6313,7 @@ scrollToFirstResult:(BOOL)scrollToFirstResult {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_tmuxController ping];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_tmuxController validateOptions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_tmuxController checkForUTF8];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_tmuxController guessVersion];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_tmuxController loadTitleFormat];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [_tmuxController guessVersion];  // NOTE: This kicks off more stuff that depends on knowing the version number.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)tmuxInitialCommandDidFailWithError:(NSString *)error {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/PTYTab.m sources/PTYTab.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a8f8b48..6c4766e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/PTYTab.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/PTYTab.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3690,11 +3690,12 @@ static void SetAgainstGrainDim(BOOL isVertical, NSSize *dest, CGFloat value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _tmuxTitleMonitor = [[iTermTmuxOptionMonitor alloc] initWithGateway:tmuxController_.gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                 scope:self.variablesScope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                format:tmuxController_.setTitlesString
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                target:[NSString stringWithFormat:@"@%@", @(self.tmuxWindow)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                          variableName:iTermVariableKeyTabTmuxWindowTitle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                 block:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                  scope:self.variablesScope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                   fallbackVariableName:iTermVariableKeySessionWindowName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                 format:@"#{T:set-titles-string}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                 target:[NSString stringWithFormat:@"@%@", @(self.tmuxWindow)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                           variableName:iTermVariableKeyTabTmuxWindowTitle
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                  block:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_tmuxTitleMonitor updateOnce];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (self.titleOverride.length == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // Show the tmux window title if both the tmux option set-titles is on and the user hasn't
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4312,7 +4313,7 @@ static void SetAgainstGrainDim(BOOL isVertical, NSSize *dest, CGFloat value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (self.tmuxTab) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (titleOverride) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [self.tmuxController renameWindowWithId:self.tmuxWindow
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                          inSession:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    inSessionNumber:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              toName:titleOverride];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/PseudoTerminal.m sources/PseudoTerminal.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b90e733..24f041a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/PseudoTerminal.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/PseudoTerminal.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3018,8 +3018,8 @@ ITERM_WEAKLY_REFERENCEABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([arrangement objectForKey:TERMINAL_GUID] &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [[arrangement objectForKey:TERMINAL_GUID] isKindOfClass:[NSString class]]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSString *savedGUID = [arrangement objectForKey:TERMINAL_GUID];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if ([[iTermController sharedInstance] terminalWithGuid:savedGUID]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            // Refuse to create a window with an already-used guid.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if ([[iTermController sharedInstance] terminalWithGuid:savedGUID] || ![self stringIsValidTerminalGuid:savedGUID]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            // Refuse to create a window with an already-used or invalid guid.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.terminalGuid = [NSString stringWithFormat:@"pty-%@", [NSString uuid]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.terminalGuid = savedGUID;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3039,6 +3039,11 @@ ITERM_WEAKLY_REFERENCEABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return YES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)stringIsValidTerminalGuid:(NSString *)string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [string rangeOfCharacterFromSet:characterSet.invertedSet].location == NSNotFound;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (BOOL)restoreTabsFromArrangement:(NSDictionary *)arrangement sessions:(NSArray<PTYSession *> *)sessions {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (NSDictionary *tabArrangement in arrangement[TERMINAL_ARRANGEMENT_TABS]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSDictionary<NSString *, PTYSession *> *sessionMap = nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxController.h sources/TmuxController.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f27bacc..f1e5ad3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxController.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxController.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -8,6 +8,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import <Cocoa/Cocoa.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "ProfileModel.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "iTermInitialDirectory.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "iTermTmuxSessionObject.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "TmuxGateway.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "WindowControllerInterface.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -33,7 +34,7 @@ extern NSString *const kTmuxControllerWindowDidClose;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern NSString *const kTmuxControllerAttachedSessionDidChange;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Posted when a session changes name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern NSString *const kTmuxControllerSessionWasRenamed;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// Posted when set-titles-string option changes. Object is tmux controller.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Posted when set-titles option changes. Object is tmux controller.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @interface TmuxController : NSObject
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -41,7 +42,7 @@ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) TmuxGateway *gateway;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, retain) NSMutableDictionary *windowPositions;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, copy) NSString *sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-@property(nonatomic, retain) NSArray *sessions;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@property(nonatomic, copy) NSArray<iTermTmuxSessionObject *> *sessionObjects;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, assign) BOOL ambiguousIsDoubleWidth;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, assign) NSInteger unicodeVersion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) NSString *clientName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -53,7 +54,6 @@ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) NSDictionary *sharedFontOverrides;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) NSString *sessionGuid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) BOOL variableWindowSize;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-@property(nonatomic, readonly) NSString *setTitlesString;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) BOOL shouldSetTitles;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, readonly) BOOL serverIsLocal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -120,9 +120,9 @@ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        initialDirectory:(iTermInitialDirectory *)initialDirectory;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)newWindowInSession:(NSString *)targetSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                     scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          initialDirectory:(iTermInitialDirectory *)initialDirectory;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)newWindowInSessionNumber:(NSNumber *)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                initialDirectory:(iTermInitialDirectory *)initialDirectory;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)selectPane:(int)windowPane;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -150,9 +150,11 @@ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)killWindowPane:(int)windowPane;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)killWindow:(int)window;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)unlinkWindowWithId:(int)windowId inSession:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)unlinkWindowWithId:(int)windowId;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)requestDetach;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)renameWindowWithId:(int)windowId inSession:(NSString *)sessionName toName:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)renameWindowWithId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           inSessionNumber:(NSNumber *)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    toName:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (BOOL)canRenamePane;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)renamePane:(int)windowPane toTitle:(NSString *)newTitle;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)setHotkeyForWindowPane:(int)windowPane to:(NSDictionary *)hotkey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -162,21 +164,25 @@ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (NSString *)tabColorStringForWindowPane:(int)windowPane;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)linkWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)moveWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)renameSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         to:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)renameSession:(NSString *)oldName to:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)killSession:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)attachToSession:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)killSessionNumber:(int)sessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)attachToSessionWithNumber:(int)sessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)addSessionWithName:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// NOTE: If the session name is bogus (or any other error occurs) the selector will not be called.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)listWindowsInSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      target:(id)target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    selector:(SEL)selector
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      object:(id)object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// NOTE: If anything goes wrong the selector will not be called.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)listWindowsInSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            target:(id)target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          selector:(SEL)selector
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            object:(id)object;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)listSessions;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)saveAffinities;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)saveWindowOrigins;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -200,7 +206,6 @@ extern NSString *const kTmuxControllerDidFetchSetTitlesStringOption;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)setLayoutInWindow:(int)window toLayout:(NSString *)layout;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (NSArray<PTYSession *> *)clientSessions;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)setSize:(NSSize)size windows:(NSArray<NSString *> *)windows;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)setSize:(NSSize)size window:(int)window;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxController.m sources/TmuxController.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 08cbd91..77b0424 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxController.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxController.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -20,6 +20,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "iTermShortcut.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "iTermTuple.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "NSArray+iTerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "NSData+iTerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "NSFont+iTerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "NSStringITerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "PreferencePanel.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,6 +43,12 @@ NSString *const kTmuxControllerWindowDidClose = @"kTmuxControllerWindowDidClose"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NSString *const kTmuxControllerSessionWasRenamed = @"kTmuxControllerSessionWasRenamed";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NSString *const kTmuxControllerDidFetchSetTitlesStringOption = @"kTmuxControllerDidFetchSetTitlesStringOption";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static NSString *const iTermTmuxControllerEncodingPrefixHotkeys = @"h_";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static NSString *const iTermTmuxControllerEncodingPrefixTabColors = @"t_";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static NSString *const iTermTmuxControllerEncodingPrefixAffinities = @"a_";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static NSString *const iTermTmuxControllerEncodingPrefixOrigins = @"o_";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static NSString *const iTermTmuxControllerEncodingPrefixHidden = @"i_";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Unsupported global options:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static NSString *const kAggressiveResize = @"aggressive-resize";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,7 +88,7 @@ static NSString *kListWindowsFormat = @"\"#{session_name}\t#{window_id}\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     TmuxGateway *gateway_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSMutableDictionary *windowPanes_;  // paneId -> PTYSession *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSMutableDictionary<NSNumber *, iTermTmuxWindowState *> *_windowStates;      // Key is window number
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSArray *sessions_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSArray<iTermTmuxSessionObject *> *sessionObjects_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int numOutstandingWindowResizes_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSMutableDictionary *windowPositions_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSSize lastSize_;  // last size for windowDidChange:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -97,7 +104,7 @@ static NSString *kListWindowsFormat = @"\"#{session_name}\t#{window_id}\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BOOL windowOriginsDirty_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BOOL haveOutstandingSaveWindowOrigins_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSMutableDictionary *origins_;  // window id -> NSValue(Point) window origin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSMutableSet *hiddenWindows_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSMutableSet<NSNumber *> *hiddenWindows_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSTimer *listSessionsTimer_;  // Used to do a cancelable delayed perform of listSessions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSTimer *listWindowsTimer_;  // Used to do a cancelable delayed perform of listWindows.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BOOL ambiguousIsDoubleWidth_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -119,7 +126,7 @@ static NSString *kListWindowsFormat = @"\"#{session_name}\t#{window_id}\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @synthesize gateway = gateway_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @synthesize windowPositions = windowPositions_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @synthesize sessionName = sessionName_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-@synthesize sessions = sessions_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@synthesize sessionObjects = sessionObjects_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @synthesize ambiguousIsDoubleWidth = ambiguousIsDoubleWidth_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @synthesize sessionId = sessionId_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -180,8 +187,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_sharedFontOverrides release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_pendingWindows release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [sessionName_ release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [sessions_ release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_setTitlesString release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [sessionObjects_ release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [super dealloc];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -392,16 +398,22 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [windowsToOpen addObject:record];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    BOOL tooMany = NO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (windowsToOpen.count > [iTermPreferences intForKey:kPreferenceKeyTmuxDashboardLimit]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         DLog(@"There are too many windows to open so just show the dashboard");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         haveHidden = YES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        tooMany = YES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [windowsToOpen removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (haveHidden) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         DLog(@"Hidden windows existing, showing dashboard");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [[TmuxDashboardController sharedInstance] showWindow:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [[[TmuxDashboardController sharedInstance] window] makeKeyAndOrderFront:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [[iTermNotificationController sharedInstance] notify:@"Too many tmux windows!" withDescription:@"Use the tmux dashboard to select which to open."];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (tooMany) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            [[iTermNotificationController sharedInstance] notify:@"Too many tmux windows!" withDescription:@"Use the tmux dashboard to select which to open."];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            [[iTermNotificationController sharedInstance] notify:@"Some tmux windows were hidden." withDescription:@"Use the tmux dashboard to select which to open."];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (NSArray *record in windowsToOpen) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         DLog(@"Open window %@", record);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -459,7 +471,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *setSizeCommand = [NSString stringWithFormat:@"refresh-client -C %d,%d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 size.width, [self adjustHeightForStatusBar:size.height]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *listWindowsCommand = [NSString stringWithFormat:@"list-windows -F %@", kListWindowsFormat];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *listSessionsCommand = @"list-sessions -F \"#{session_name}\"";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *listSessionsCommand = @"list-sessions -F \"#{session_id} #{session_name}\"";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *getAffinitiesCommand = [NSString stringWithFormat:@"show -v -q -t $%d @affinities", sessionId_];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *getOriginsCommand = [NSString stringWithFormat:@"show -v -q -t $%d @origins", sessionId_];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *getHotkeysCommand = [NSString stringWithFormat:@"show -v -q -t $%d @hotkeys", sessionId_];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -715,10 +727,6 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)setSize:(NSSize)size windows:(NSArray<NSString *> *)windows {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [gateway_ sendCommandList:[self commandListToSetSize:size ofWindows:windows]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)setWindowSizes:(NSArray<iTermTuple<NSString *, NSValue *> *> *)windowSizes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommandList:[self commandListToSetWindowSizes:windowSizes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -727,14 +735,14 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return [windowSizes mapWithBlock:^NSDictionary *(iTermTuple<NSString *,NSValue *> *tuple) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSString *window = tuple.firstObject;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSSize size = tuple.secondObject.sizeValue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if ([window hasPrefix:@"pty"]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if ([window hasPrefix:@"pty"] || [window hasSuffix:@"_ph"]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // 10000 comes from WINDOW_MAXIMUM in tmux.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (size.width < 1 || size.height < 1 || size.width >= 10000 || size.height >= 10000) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        NSString *command = [NSString stringWithFormat:@"resize-window -x %@ -y %@ -t @%@", @((int)size.width), @((int)size.height), window];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSString *command = [NSString stringWithFormat:@"resize-window -x %@ -y %@ -t @%d", @((int)size.width), @((int)size.height), window.intValue];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSDictionary *dict = [gateway_ dictionaryForCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                              responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseSelector:@selector(handleResizeWindowResponse:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -857,11 +865,6 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommandList:@[ [gateway_ dictionaryForCommand:@"show-options -v -g set-titles"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                responseSelector:@selector(handleShowSetTitles:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                 responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                          flags:0],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                 [gateway_ dictionaryForCommand:@"show-options -v -g set-titles-string"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                 responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                               responseSelector:@selector(handleShowSetTitlesString:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                           flags:0] ]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -872,10 +875,6 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                         object:self];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)handleShowSetTitlesString:(NSString *)setTitlesString {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _setTitlesString = [setTitlesString copy];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)guessVersion {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Run commands that will fail in successively older versions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // show-window-options pane-border-format will succeed in 2.3 and later (presumably. 2.3 isn't out yet)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1013,17 +1012,25 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // This is the oldest version supported. By the time you get here you know the version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [self didGuessVersion];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// Actions to perform after the version number is known.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)didGuessVersion {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self loadServerPID];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [self loadTitleFormat];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (BOOL)recyclingSupported {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSDecimalNumber *version1_9 = [NSDecimalNumber decimalNumberWithString:@"1.9"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (gateway_.minimumServerVersion != nil) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return ([gateway_.minimumServerVersion compare:version1_9] != NSOrderedAscending);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        // Assume 1.8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)versionAtLeastDecimalNumberWithString:(NSString *)string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSDecimalNumber *version = [NSDecimalNumber decimalNumberWithString:string];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (gateway_.minimumServerVersion == nil) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return NO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return ([gateway_.minimumServerVersion compare:version] != NSOrderedAscending);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)recyclingSupported {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [self versionAtLeastDecimalNumberWithString:@"1.9"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Show an error and terminate the connection because tmux has an unsupported option turned on.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1143,10 +1150,10 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)newWindowInSession:(NSString *)targetSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                     scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          initialDirectory:(iTermInitialDirectory *)initialDirectory {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [initialDirectory tmuxNewWindowCommandInSession:targetSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)newWindowInSessionNumber:(NSNumber *)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                initialDirectory:(iTermInitialDirectory *)initialDirectory {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [initialDirectory tmuxNewWindowCommandInSessionNumber:sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  recyclingSupported:self.recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                               scope:scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          completion:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1164,7 +1171,11 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                           flags:0]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         [commands addObject:[gateway_ dictionaryForCommand:command responseTarget:nil responseSelector:nil responseObject:nil flags:0]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         [commands addObject:[gateway_ dictionaryForCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                           responseSelector:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                      flags:0]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          [gateway_ sendCommandList:commands];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1218,8 +1229,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)unlinkWindowWithId:(int)windowId inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)unlinkWindowWithId:(int)windowId {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:[NSString stringWithFormat:@"unlink-window -k -t @%d", windowId]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1232,11 +1242,14 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)renameWindowWithId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                 inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           inSessionNumber:(NSNumber *)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     toName:(NSString *)newName {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *theCommand;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (sessionName) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        theCommand = [NSString stringWithFormat:@"rename-window -t \"%@:@%d\" \"%@\"", sessionName, windowId, [self stringByEscapingBackslashesAndRemovingNewlines:newName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (sessionNumber) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        theCommand = [NSString stringWithFormat:@"rename-window -t \"$%d:@%d\" \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      sessionNumber.intValue,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      windowId,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      [self stringByEscapingBackslashesAndRemovingNewlines:newName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         theCommand = [NSString stringWithFormat:@"rename-window -t @%d \"%@\"", windowId, [self stringByEscapingBackslashesAndRemovingNewlines:newName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1312,9 +1325,23 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self sendCommandToSetTabColors];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSString *)encodedString:(NSString *)string prefix:(NSString *)prefix {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [prefix stringByAppendingString:[[string dataUsingEncoding:NSUTF8StringEncoding] it_hexEncoded]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSString *)decodedString:(NSString *)string optionalPrefix:(NSString *)prefix {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (![string hasPrefix:prefix]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return string;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [[[NSString alloc] initWithData:[[string substringFromIndex:prefix.length] dataFromHexValues]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  encoding:NSUTF8StringEncoding] autorelease];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)sendCommandToSetHotkeys {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *hexEncoded = [self encodedString:[self.hotkeysString stringByEscapingQuotes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        prefix:iTermTmuxControllerEncodingPrefixHotkeys];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *command = [NSString stringWithFormat:@"set -t $%d @hotkeys \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         sessionId_, [self.hotkeysString stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         sessionId_, hexEncoded];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1323,8 +1350,10 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)sendCommandToSetTabColors {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *command = [NSString stringWithFormat:@"set -t $%d @tab_colors \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         sessionId_, [self.tabColorsString stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         sessionId_, [self encodedString:[self.tabColorsString stringByEscapingQuotes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                  prefix:iTermTmuxControllerEncodingPrefixTabColors]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1376,7 +1405,8 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)breakOutWindowPane:(int)windowPane toTabAside:(NSString *)sibling
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [gateway_ sendCommand:[NSString stringWithFormat:@"break-pane -P -F \"#{window_id}\" %@ \"%%%d\"", [self breakPaneWindowPaneFlag], windowPane]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [gateway_ sendCommand:[NSString stringWithFormat:@"break-pane -P -F \"#{window_id}\" %@ \"%%%d\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           [self breakPaneWindowPaneFlag], windowPane]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:@selector(windowPaneBrokeOutWithWindowId:setAffinityTo:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseObject:sibling
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1435,19 +1465,19 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)linkWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [gateway_ sendCommand:[NSString stringWithFormat:@"link-window -s \"%@:@%d\" -t \"%@:+\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           sessionName, windowId, targetSession]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [gateway_ sendCommand:[NSString stringWithFormat:@"link-window -s \"$%d:@%d\" -t \"$%d:+\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           sessionNumber, windowId, targetSessionNumber]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)moveWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [gateway_ sendCommand:[NSString stringWithFormat:@"move-window -s \"%@:@%d\" -t \"%@:+\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           sessionName, windowId, targetSession]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [gateway_ sendCommand:[NSString stringWithFormat:@"move-window -s \"$%d:@%d\" -t \"$%d:+\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           sessionNumber, windowId, targetSessionNumber]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1467,19 +1497,19 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)renameSession:(NSString *)oldName to:(NSString *)newName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *renameCommand = [NSString stringWithFormat:@"rename-session -t \"%@\" \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               [oldName stringByEscapingQuotes],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)renameSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         to:(NSString *)newName {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *renameCommand = [NSString stringWithFormat:@"rename-session -t \"$%d\" \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               sessionNumber,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                [newName stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:renameCommand responseTarget:nil responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)killSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *killCommand = [NSString stringWithFormat:@"kill-session -t \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                [sessionName stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [gateway_ sendCommand:killCommand responseTarget:nil responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)killSessionNumber:(int)sessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *killCommand = [NSString stringWithFormat:@"kill-session -t \"$%d\"", sessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [gateway_ sendCommand:killCommand
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self listSessions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1493,44 +1523,46 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self listSessions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)attachToSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *attachCommand = [NSString stringWithFormat:@"attach-session -t \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                             [sessionName stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)attachToSessionWithNumber:(int)sessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *attachCommand = [NSString stringWithFormat:@"attach-session -t \"$%d\"", sessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:attachCommand
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)listWindowsInSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      target:(id)target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    selector:(SEL)selector
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      object:(id)object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)listWindowsInSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            target:(id)target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          selector:(SEL)selector
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            object:(id)object {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (detached_ || !object) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // This can happen if you're not attached to a session.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *listWindowsCommand = [NSString stringWithFormat:@"list-windows -F %@ -t \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                    kListWindowsFormat, sessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *listWindowsCommand = [NSString stringWithFormat:@"list-windows -F %@ -t \"$%d\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    kListWindowsFormat, sessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Wait a few seconds. We always get a windows-close notification when the last window in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // a window closes. To avoid spamming the command line with list-windows, we wait a bit to see
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // if there is an exit notification coming down the pipe.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     const CGFloat kListWindowsDelay = 1.5;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [listWindowsTimer_ invalidate];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    listWindowsTimer_ = [NSTimer scheduledTimerWithTimeInterval:kListWindowsDelay
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                         target:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                       selector:@selector(listWindowsTimerFired:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                       userInfo:[NSArray arrayWithObjects:listWindowsCommand, object, target, NSStringFromSelector(selector), nil]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                        repeats:NO];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    listWindowsTimer_ =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [NSTimer scheduledTimerWithTimeInterval:kListWindowsDelay
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     target:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   selector:@selector(listWindowsTimerFired:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   userInfo:@[listWindowsCommand,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                              object,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                              target,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                              NSStringFromSelector(selector) ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    repeats:NO];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)listWindowsTimerFired:(NSTimer *)timer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSArray *array = [timer userInfo];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *command = [array objectAtIndex:0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    id object = [array objectAtIndex:1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    id target = [array objectAtIndex:2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *selector = [array objectAtIndex:3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *command = array[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    id object = array[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    id target = array[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *selector = array[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [listWindowsTimer_ invalidate];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     listWindowsTimer_ = nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1538,10 +1570,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:@selector(didListWindows:userData:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           responseObject:[NSArray arrayWithObjects:object,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           selector,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           target,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           nil]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           responseObject:@[object, selector, target]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     flags:kTmuxGatewayCommandShouldTolerateErrors];  // Tolerates errors because the session may have been detached by the time we get the notification or the timer fires.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1549,8 +1578,10 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *hidden = [[hiddenWindows_ allObjects] componentsJoinedByString:@","];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *command = [NSString stringWithFormat:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        @"set -t $%d @hidden \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        sessionId_, hidden];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         @"set -t $%d @hidden \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         sessionId_,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         [self encodedString:hidden
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                      prefix:iTermTmuxControllerEncodingPrefixHidden]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [gateway_ sendCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            responseTarget:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          responseSelector:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1594,7 +1625,9 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *enc = [maps componentsJoinedByString:@" "];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DLog(@"Save window origins to %@ called from %@", enc, [NSThread callStackSymbols]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *command = [NSString stringWithFormat:@"set -t $%d @origins \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             sessionId_, [enc stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         sessionId_,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         [self encodedString:[enc stringByEscapingQuotes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                      prefix:iTermTmuxControllerEncodingPrefixOrigins]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!lastOrigins_ || ![command isEqualToString:lastOrigins_]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [lastOrigins_ release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         lastOrigins_ = [command copy];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1603,7 +1636,8 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              responseSelector:@selector(saveWindowOriginsResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [self getOriginsResponse:enc];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [self getOriginsResponse:[self encodedString:[enc stringByEscapingQuotes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                          prefix:iTermTmuxControllerEncodingPrefixOrigins]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)saveWindowOriginsResponse:(NSString *)response
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1651,7 +1685,8 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Update affinities if any have changed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *arg = [affinities componentsJoinedByString:@" "];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *command = [NSString stringWithFormat:@"set -t $%d @affinities \"%@\"",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                         sessionId_, [arg stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         sessionId_, [self encodedString:[arg stringByEscapingQuotes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                  prefix:iTermTmuxControllerEncodingPrefixAffinities]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([command isEqualToString:lastSaveAffinityCommand_]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1763,7 +1798,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          responseSelector:@selector(didSetLayout:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                     flags:0],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           [gateway_ dictionaryForCommand:[NSString stringWithFormat:@"list-windows -F \"#{window_id} #{window_layout} #{window_flags}\" -t \"%@\"", sessionName_]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           [gateway_ dictionaryForCommand:[NSString stringWithFormat:@"list-windows -F \"#{window_id} #{window_layout} #{window_flags}\" -t \"$%d\"", sessionId_]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          responseSelector:@selector(didListWindowsSubsequentToSettingLayout:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1777,7 +1812,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          responseSelector:@selector(didSetLayout:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                     flags:0],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           [gateway_ dictionaryForCommand:[NSString stringWithFormat:@"list-windows -F \"#{window_id} #{window_layout} #{window_flags}\" -t \"%@\"", sessionName_]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           [gateway_ dictionaryForCommand:[NSString stringWithFormat:@"list-windows -F \"#{window_id} #{window_layout} #{window_flags}\" -t \"$%d\"", sessionId_]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          responseSelector:@selector(didListWindowsSubsequentToSettingLayout:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            responseObject:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1798,31 +1833,32 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark - Private
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)getOriginsResponse:(NSString *)result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  [origins_ removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if ([result length] > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSArray *windows = [result componentsSeparatedByString:@" "];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (NSString *wstr in windows) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      NSArray *tuple = [wstr componentsSeparatedByString:@":"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (tuple.count != 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      NSString *windowsStr = [tuple objectAtIndex:0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      NSString *coords = [tuple objectAtIndex:1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      NSArray *windowIds = [windowsStr componentsSeparatedByString:@","];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      NSArray *xy = [coords componentsSeparatedByString:@","];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (xy.count != 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      NSPoint origin = NSMakePoint([[xy objectAtIndex:0] intValue],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                   [[xy objectAtIndex:1] intValue]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      for (NSString *wid in windowIds) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [origins_ setObject:[NSValue valueWithPoint:origin]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                     forKey:[NSNumber numberWithInt:[wid intValue]]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)getOriginsResponse:(NSString *)encodedResult {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *result = [self decodedString:encodedResult
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            optionalPrefix:iTermTmuxControllerEncodingPrefixOrigins];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [origins_ removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ([result length] > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSArray *windows = [result componentsSeparatedByString:@" "];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for (NSString *wstr in windows) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            NSArray *tuple = [wstr componentsSeparatedByString:@":"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (tuple.count != 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            NSString *windowsStr = [tuple objectAtIndex:0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            NSString *coords = [tuple objectAtIndex:1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            NSArray *windowIds = [windowsStr componentsSeparatedByString:@","];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            NSArray *xy = [coords componentsSeparatedByString:@","];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (xy.count != 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            NSPoint origin = NSMakePoint([[xy objectAtIndex:0] intValue],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                         [[xy objectAtIndex:1] intValue]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            for (NSString *wid in windowIds) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                [origins_ setObject:[NSValue valueWithPoint:origin]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                             forKey:[NSNumber numberWithInt:[wid intValue]]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (NSString *)shortStringForHotkeyDictionary:(NSDictionary *)dict paneID:(int)wp {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1851,7 +1887,8 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return [parts componentsJoinedByString:@" "];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)getHotkeysResponse:(NSString *)result {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)getHotkeysResponse:(NSString *)encodedResult {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *result = [self decodedString:encodedResult optionalPrefix:iTermTmuxControllerEncodingPrefixHotkeys];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_hotkeys removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (result.length > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [_hotkeys removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1870,7 +1907,9 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)getTabColorsResponse:(NSString *)result {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)getTabColorsResponse:(NSString *)encodedResult {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *result = [self decodedString:encodedResult
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            optionalPrefix:iTermTmuxControllerEncodingPrefixTabColors];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [_tabColors removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (result.length > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [_tabColors removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1903,14 +1942,15 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         response = @"";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     TSVDocument *doc = [response tsvDocumentWithFields:[self listWindowFields]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    id object = [userData objectAtIndex:0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    SEL selector = NSSelectorFromString([userData objectAtIndex:1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    id target = [userData objectAtIndex:2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    id object = userData[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    SEL selector = NSSelectorFromString(userData[1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    id target = userData[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [target performSelector:selector withObject:doc withObject:object];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)getHiddenWindowsResponse:(NSString *)response
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)getHiddenWindowsResponse:(NSString *)encodedResponse {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *response = [self decodedString:encodedResponse
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              optionalPrefix:iTermTmuxControllerEncodingPrefixHidden];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [hiddenWindows_ removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([response length] > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSArray *windowIds = [response componentsSeparatedByString:@","];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1922,7 +1962,7 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)getAffinitiesResponse:(NSString *)result {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [self setAffinitiesFromString:result];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [self setAffinitiesFromString:[self decodedString:result optionalPrefix:iTermTmuxControllerEncodingPrefixAffinities]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (NSArray *)componentsOfAffinities:(NSString *)affinities {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1991,9 +2031,28 @@ static NSDictionary *iTermTmuxControllerDefaultFontOverridesFromProfile(Profile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)listSessionsResponse:(NSString *)result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    self.sessions = [result componentsSeparatedByRegex:@"\n"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    self.sessionObjects = [[result componentsSeparatedByRegex:@"\n"] mapWithBlock:^iTermTmuxSessionObject *(NSString *line) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        const NSInteger space = [line rangeOfString:@" "].location;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (space == NSNotFound) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSString *sessionID = [line substringToIndex:space];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSString *sessionName = [line substringFromIndex:space + 1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (![sessionID hasPrefix:@"$"]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSScanner *scanner = [NSScanner scannerWithString:[sessionID substringFromIndex:1]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        int sessionNumber = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (![scanner scanInt:&sessionNumber] || sessionNumber < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        iTermTmuxSessionObject *obj = [[[iTermTmuxSessionObject alloc] init] autorelease];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        obj.name = sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        obj.number = sessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return obj;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[NSNotificationCenter defaultCenter] postNotificationName:kTmuxControllerSessionsDidChange
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                        object:self.sessions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                        object:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)listedWindowsToOpenOne:(NSString *)response
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxDashboardController.m sources/TmuxDashboardController.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b83bfe6..b2ed7b7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxDashboardController.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxDashboardController.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -49,7 +49,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (self) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [self window];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [sessionsTable_ selectSessionWithName:[[self tmuxController] sessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [sessionsTable_ selectSessionNumber:[[self tmuxController] sessionId]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [self reloadWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [[NSNotificationCenter defaultCenter] addObserver:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  selector:@selector(tmuxControllerDetached:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,78 +140,79 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark TmuxSessionsTableProtocol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)renameSessionWithName:(NSString *)oldName toName:(NSString *)newName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [[self tmuxController] renameSession:oldName to:newName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)renameSessionWithNumber:(int)sessionNumber toName:(NSString *)newName {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] renameSessionNumber:sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                            to:newName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)removeSessionWithName:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [[self tmuxController] killSession:sessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)removeSessionWithNumber:(int)sessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] killSessionNumber:sessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)addSessionWithName:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)addSessionWithName:(NSString *)sessionName {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[self tmuxController] addSessionWithName:sessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)attachToSessionWithName:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [[self tmuxController] attachToSession:sessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)attachToSessionWithNumber:(int)sessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] attachToSessionWithNumber:sessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)detach
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)detach {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[self tmuxController] requestDetach];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)nameOfAttachedSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return [[self tmuxController] sessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSNumber *)numberOfAttachedSession {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TmuxController *controller = [self tmuxController];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!controller) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return @([controller sessionId]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSArray *)sessions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return [[self tmuxController] sessions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSArray<iTermTmuxSessionObject *> *)sessionsTableModelValues:(id)sender {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [self.tmuxController sessionObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)selectedSessionChangedTo:(NSString *)newSessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSArray<iTermTmuxSessionObject *> *)sessionsTableObjects:(TmuxSessionsTable *)sender {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [[self tmuxController] sessionObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)selectedSessionDidChange {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [windowsTable_ setWindows:[NSArray array]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self reloadWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)linkWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sourceSessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[self tmuxController] linkWindowId:windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              inSession:sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              toSession:targetSession];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        inSessionNumber:sourceSessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        toSessionNumber:targetSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)moveWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[self tmuxController] moveWindowId:windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              inSession:sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              toSession:targetSession];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        inSessionNumber:sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        toSessionNumber:targetSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark TmuxWindowsTableProtocol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)reloadWindows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [[self tmuxController] listWindowsInSession:[sessionsTable_ selectedSessionName]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         target:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                       selector:@selector(setWindows:forSession:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         object:[sessionsTable_ selectedSessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)reloadWindows {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSNumber *sessionNumber = [sessionsTable_ selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!sessionNumber) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] listWindowsInSessionNumber:sessionNumber.intValue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                               target:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             selector:@selector(setWindows:forSession:)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                               object:[sessionsTable_ selectedSessionNumber]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)setWindows:(TSVDocument *)doc forSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if ([sessionName isEqualToString:[sessionsTable_ selectedSessionName]]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)setWindows:(TSVDocument *)doc forSession:(NSNumber *)sessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ([sessionNumber isEqual:[sessionsTable_ selectedSessionNumber]]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSMutableArray *windows = [NSMutableArray array];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for (NSArray *record in doc.records) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [windows addObject:[NSMutableArray arrayWithObjects:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -223,18 +224,19 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)renameWindowWithId:(int)windowId toName:(NSString *)newName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)renameWindowWithId:(int)windowId toName:(NSString *)newName {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSNumber *sessionNumber = [sessionsTable_ selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!sessionNumber) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[self tmuxController] renameWindowWithId:windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                    inSession:[sessionsTable_ selectedSessionName]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              inSessionNumber:sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        toName:newName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self reloadWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)unlinkWindowWithId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [[self tmuxController] unlinkWindowWithId:windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                    inSession:[sessionsTable_ selectedSessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)unlinkWindowWithId:(int)windowId {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] unlinkWindowWithId:windowId];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self reloadWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -242,15 +244,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *lastName = [[windowsTable_ names] lastObject];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (lastName) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         TmuxController *tmuxController = self.tmuxController;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [tmuxController newWindowInSession:[sessionsTable_ selectedSessionName]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                     scope:[iTermVariableScope globalsScope]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          initialDirectory:[iTermInitialDirectory initialDirectoryFromProfile:tmuxController.sharedProfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                                                   objectType:iTermWindowObject]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [tmuxController newWindowInSessionNumber:[sessionsTable_ selectedSessionNumber]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                           scope:[iTermVariableScope globalsScope]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                initialDirectory:[iTermInitialDirectory initialDirectoryFromProfile:tmuxController.sharedProfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                                                         objectType:iTermWindowObject]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)showWindowsWithIds:(NSArray *)windowIds inTabs:(BOOL)inTabs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)showWindowsWithIds:(NSArray *)windowIds inTabs:(BOOL)inTabs {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (inTabs) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for (NSNumber *wid in windowIds) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [[self tmuxController] openWindowWithId:[wid intValue]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -265,27 +266,24 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                             profile:self.tmuxController.sharedProfile];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  [[self tmuxController] saveHiddenWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] saveHiddenWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)hideWindowWithId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  [[self tmuxController] hideWindow:windowId];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [[self tmuxController] hideWindow:windowId];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [windowsTable_ updateEnabledStateOfButtons];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (BOOL)haveSelectedSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return [sessionsTable_ selectedSessionName] != nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)haveSelectedSession {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [sessionsTable_ selectedSessionNumber] != nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (BOOL)currentSessionSelected
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return [[sessionsTable_ selectedSessionName] isEqualToString:[[self tmuxController] sessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)currentSessionSelected {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [[sessionsTable_ selectedSessionNumber] isEqual:@([[self tmuxController] sessionId])];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (BOOL)haveOpenWindowWithId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)haveOpenWindowWithId:(int)windowId {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return [[self tmuxController] window:windowId] != nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -294,48 +292,41 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [tab.activeSession reveal];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)selectedSessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return [sessionsTable_ selectedSessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSNumber *)selectedSessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [sessionsTable_ selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark - Private
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerDetached:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [sessionsTable_ setSessions:[NSArray array]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerDetached:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [sessionsTable_ setSessionObjects:@[]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerSessionsDidChange:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [sessionsTable_ setSessions:[[self tmuxController] sessions]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerSessionsDidChange:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [sessionsTable_ setSessionObjects:[[self tmuxController] sessionObjects]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerWindowsDidChange:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerWindowsDidChange:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([[self window] isVisible]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [self reloadWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerAttachedSessionChanged:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerAttachedSessionChanged:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([[self window] isVisible]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [sessionsTable_ selectSessionWithName:[[self tmuxController] sessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [sessionsTable_ selectSessionNumber:[[self tmuxController] sessionId]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [windowsTable_ updateEnabledStateOfButtons];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerWindowOpenedOrClosed:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerWindowOpenedOrClosed:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([[self window] isVisible]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [windowsTable_ updateEnabledStateOfButtons];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [windowsTable_ reloadData];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerWindowWasRenamed:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerWindowWasRenamed:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if ([[self window] isVisible]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSArray *objects = [notification object];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         int wid = [[objects objectAtIndex:0] intValue];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -344,8 +335,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxControllerSessionWasRenamed:(NSNotification *)notification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxControllerSessionWasRenamed:(NSNotification *)notification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // This is a bit of extra work but the sessions table wasn't built knowing about session IDs.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [[self tmuxController] listSessions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -364,8 +354,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self connectionSelectionDidChange:nil];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (TmuxController *)tmuxController
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (TmuxController *)tmuxController {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return [[TmuxControllerRegistry sharedInstance] controllerForClient:[self currentClient]];  // TODO: track the current client when multiples are supported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -375,7 +364,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (IBAction)connectionSelectionDidChange:(id)sender {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [sessionsTable_ setSessions:[[self tmuxController] sessions]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [sessionsTable_ setSessionObjects:[[self tmuxController] sessionObjects]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self reloadWindows];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxSessionsTable.h sources/TmuxSessionsTable.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 856f0f5..a3e5823 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxSessionsTable.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxSessionsTable.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -9,21 +9,25 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import <Cocoa/Cocoa.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "FutureMethods.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@class TmuxSessionsTable;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@class iTermTmuxSessionObject;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @protocol TmuxSessionsTableProtocol <NSObject>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSArray *)sessions;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)renameSessionWithName:(NSString *)oldName toName:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)removeSessionWithName:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSArray<iTermTmuxSessionObject *> *)sessionsTableObjects:(TmuxSessionsTable *)sender;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)renameSessionWithNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         toName:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)removeSessionWithNumber:(int)sessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)addSessionWithName:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)attachToSessionWithName:(NSString *)sessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)nameOfAttachedSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)selectedSessionChangedTo:(NSString *)newName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)attachToSessionWithNumber:(int)sessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSNumber *)numberOfAttachedSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)selectedSessionDidChange;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)linkWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sourceSessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)moveWindowId:(int)windowId
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           inSession:(NSString *)sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           toSession:(NSString *)targetSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     inSessionNumber:(int)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     toSessionNumber:(int)targetSessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)detach;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -31,9 +35,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @interface TmuxSessionsTable : NSObject <NSTableViewDelegate, NSTableViewDataSource>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property(nonatomic, assign) id<TmuxSessionsTableProtocol> delegate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-@property(nonatomic, readonly) NSString *selectedSessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@property(nonatomic, readonly) NSNumber *selectedSessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)setSessions:(NSArray *)names;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)selectSessionWithName:(NSString *)name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)setSessionObjects:(NSArray<iTermTmuxSessionObject *> *)names;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)selectSessionNumber:(int)number;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxSessionsTable.m sources/TmuxSessionsTable.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f9a086f..88e2f72 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxSessionsTable.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxSessionsTable.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -7,12 +7,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "TmuxSessionsTable.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "FutureMethods.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "iTermTmuxSessionObject.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "NSArray+iTerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @implementation TmuxSessionsTable {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSMutableArray *model_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSMutableArray<iTermTmuxSessionObject *> *_model;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BOOL canAttachToSelectedSession_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     IBOutlet NSTableColumn *checkColumn_;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -28,7 +31,7 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (instancetype)init {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     self = [super init];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (self) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        model_ = [[NSMutableArray alloc] init];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _model = [[NSMutableArray alloc] init];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return self;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,27 +42,27 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [tableView_ setDraggingDestinationFeedbackStyle:NSTableViewDraggingDestinationFeedbackStyleRegular];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)dealloc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [model_ release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)dealloc {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [_model release];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [super dealloc];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)setDelegate:(id<TmuxSessionsTableProtocol>)delegate {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     delegate_ = delegate;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [self setSessions:[delegate_ sessions]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [self setSessionObjects:[delegate_ sessionsTableObjects:self]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)setSessions:(NSArray *)names
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)setSessionObjects:(NSArray<iTermTmuxSessionObject *> *)sessions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [model_ removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [model_ addObjectsFromArray:names];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [_model removeAllObjects];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [_model addObjectsFromArray:sessions];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [tableView_ reloadData];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)selectSessionWithName:(NSString *)name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSUInteger i = [model_ indexOfObject:name];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)selectSessionNumber:(int)number {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSInteger i = [_model indexOfObjectPassingTest:^BOOL(iTermTmuxSessionObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return obj.number == number;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (i != NSNotFound) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:i]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 byExtendingSelection:NO];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -74,47 +77,45 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (IBAction)removeSession:(id)sender
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *name = [self selectedSessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (name) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [delegate_ removeSessionWithName:name];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSNumber *number = [self selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (number) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [delegate_ removeSessionWithNumber:number.intValue];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (IBAction)attach:(id)sender {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *name = [self selectedSessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (name) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        [delegate_ attachToSessionWithName:name];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSNumber *number = [self selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (number) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [delegate_ attachToSessionWithNumber:number.intValue];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (IBAction)detach:(id)sender {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *name = [self selectedSessionName];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (name) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSNumber *number = [self selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (number) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [delegate_ detach];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark NSTableViewDataSource
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return model_.count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return _model.count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (id)tableView:(NSTableView *)aTableView
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     objectValueForTableColumn:(NSTableColumn *)aTableColumn
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            row:(NSInteger)rowIndex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *name = [model_ objectAtIndex:rowIndex];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            row:(NSInteger)rowIndex {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    iTermTmuxSessionObject *sessionObject = _model[rowIndex];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (aTableColumn == checkColumn_) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if ([[delegate_ nameOfAttachedSession] isEqualToString:name]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if ([[delegate_ numberOfAttachedSession] isEqual:@(sessionObject.number)]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return @"✓";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return @"";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (rowIndex < model_.count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            return name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (rowIndex < _model.count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return sessionObject.name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -124,10 +125,9 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)tableView:(NSTableView *)aTableView
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    setObjectValue:(id)anObject
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    forTableColumn:(NSTableColumn *)aTableColumn
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              row:(NSInteger)rowIndex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [delegate_ renameSessionWithName:[model_ objectAtIndex:rowIndex]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              toName:(NSString *)anObject];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              row:(NSInteger)rowIndex {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [delegate_ renameSessionWithNumber:_model[rowIndex].number
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                toName:(NSString *)anObject];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark NSTableViewDataSource
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -138,16 +138,15 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return YES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self updateEnabledStateOfButtons];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [delegate_ selectedSessionChangedTo:[self selectedSessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [delegate_ selectedSessionDidChange];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)selectedSessionName {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSNumber *)selectedSessionNumber {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int i = [tableView_ selectedRow];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (i >= 0 && i < model_.count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return [model_ objectAtIndex:i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (i >= 0 && i < _model.count) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return @(_model[i].number);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return nil;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -159,19 +158,19 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     dropOperation:(NSTableViewDropOperation)operation {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSPasteboard *pb = [info draggingPasteboard];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSArray* pair = [pb propertyListForType:kWindowPasteboardType];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *sessionName = [pair objectAtIndex:0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSArray *draggedItems = [pair objectAtIndex:1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *targetSession = [model_ objectAtIndex:row];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSNumber *sessionNumber = pair[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSArray *draggedItems = pair[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    iTermTmuxSessionObject *targetSessionObject = _model[row];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (NSArray *tuple in draggedItems) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSNumber *windowId = [tuple objectAtIndex:1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (info.draggingSourceOperationMask & NSDragOperationLink) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [delegate_ linkWindowId:[windowId intValue]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          inSession:sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          toSession:targetSession];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    inSessionNumber:sessionNumber.intValue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    toSessionNumber:targetSessionObject.number];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             [delegate_ moveWindowId:[windowId intValue]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          inSession:sessionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          toSession:targetSession];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    inSessionNumber:sessionNumber.intValue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    toSessionNumber:targetSessionObject.number];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return YES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -205,11 +204,16 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)nameForNewSession
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (BOOL)haveSessionWithName:(NSString *)name {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [_model anyWithBlock:^BOOL(iTermTmuxSessionObject *anObject) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return [anObject.name isEqualToString:name];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSString *)nameForNewSession {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int n = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *candidate = [self nameForNewSessionWithNumber:n];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    while ([model_ indexOfObject:candidate] != NSNotFound) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    while ([self haveSessionWithName:candidate]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         n++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         candidate = [self nameForNewSessionWithNumber:n];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -223,7 +227,9 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [detachButton_ setEnabled:NO];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [removeButton_ setEnabled:NO];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        BOOL isAttachedSession = [[delegate_ nameOfAttachedSession] isEqualToString:[self selectedSessionName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSNumber *selected = [self selectedSessionNumber];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        BOOL isAttachedSession = (selected != nil &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  [[delegate_ numberOfAttachedSession] isEqual:@(selected.intValue)]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [attachButton_ setEnabled:!isAttachedSession];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [detachButton_ setEnabled:isAttachedSession];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         [removeButton_ setEnabled:YES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxWindowsTable.h sources/TmuxWindowsTable.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7c3e16c..6e9604e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxWindowsTable.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxWindowsTable.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -22,7 +22,7 @@ extern NSString *kWindowPasteboardType;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (BOOL)haveSelectedSession;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (BOOL)currentSessionSelected;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (BOOL)haveOpenWindowWithId:(int)windowId;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)selectedSessionName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSNumber *)selectedSessionNumber;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)tmuxWindowsTableDidSelectWindowWithId:(int)windowId;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/TmuxWindowsTable.m sources/TmuxWindowsTable.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 56f4954..8f92993 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/TmuxWindowsTable.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/TmuxWindowsTable.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -173,9 +173,9 @@ NSString *kWindowPasteboardType = @"kWindowPasteboardType";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)tableView:(NSTableView *)aTableView
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    setObjectValue:(id)anObject
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    forTableColumn:(NSTableColumn *)aTableColumn
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              row:(NSInteger)rowIndex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [delegate_ renameWindowWithId:[[[[self filteredModel] objectAtIndex:rowIndex] objectAtIndex:1] intValue]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              row:(NSInteger)rowIndex {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const int windowID = [[[[self filteredModel] objectAtIndex:rowIndex] objectAtIndex:1] intValue];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [delegate_ renameWindowWithId:windowID
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            toName:anObject];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -200,7 +200,7 @@ NSString *kWindowPasteboardType = @"kWindowPasteboardType";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSArray* selectedItems = [[self filteredModel] objectsAtIndexes:rowIndexes];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [pboard declareTypes:[NSArray arrayWithObject:kWindowPasteboardType] owner:self];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [pboard setPropertyList:[NSArray arrayWithObjects:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                             [delegate_ selectedSessionName],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                             [delegate_ selectedSessionNumber],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              selectedItems,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              nil]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     forType:kWindowPasteboardType];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -219,14 +219,13 @@ NSString *kWindowPasteboardType = @"kWindowPasteboardType";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma mark - Private
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSArray *)selectedWindowIdsAsStrings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        NSArray *ids = [self selectedWindowIds];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSArray *)selectedWindowIdsAsStrings {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSArray *ids = [self selectedWindowIds];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSMutableArray *result = [NSMutableArray array];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        for (NSString *n in ids) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                [result addObject:n];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (NSString *n in ids) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [result addObject:n];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (NSArray *)selectedWindowIds
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermInitialDirectory+Tmux.h sources/iTermInitialDirectory+Tmux.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a470a56..586ade6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermInitialDirectory+Tmux.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermInitialDirectory+Tmux.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @interface iTermInitialDirectory (Tmux)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxNewWindowCommandInSession:(nullable NSString *)session
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxNewWindowCommandInSessionNumber:(nullable NSNumber *)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    recyclingSupported:(BOOL)recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            completion:(void (^)(NSString *))completion;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermInitialDirectory+Tmux.m sources/iTermInitialDirectory+Tmux.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a67bea4..3259eda 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermInitialDirectory+Tmux.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermInitialDirectory+Tmux.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11,14 +11,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @implementation iTermInitialDirectory(Tmux)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)tmuxNewWindowCommandInSession:(NSString *)session
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                   recyclingSupported:(BOOL)recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                           completion:(void (^)(NSString *))completion {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (void)tmuxNewWindowCommandInSessionNumber:(nullable NSNumber *)sessionNumber
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                         recyclingSupported:(BOOL)recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                      scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 completion:(void (^)(NSString *))completion {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSArray *args = @[ @"new-window", @"-PF '#{window_id}'" ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (session) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        NSString *targetSessionArg = [NSString stringWithFormat:@"\"%@:+\"", [session stringByEscapingQuotes]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (sessionNumber) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        NSString *targetSessionArg = [NSString stringWithFormat:@"\"$%d:+\"", sessionNumber.intValue];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         NSArray *insertionArguments = @[ @"-a",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          @"-t",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          targetSessionArg ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -33,10 +33,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)tmuxNewWindowCommandRecyclingSupported:(BOOL)recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     completion:(void (^)(NSString *))completion {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [self tmuxNewWindowCommandInSession:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                     recyclingSupported:recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                  scope:scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                             completion:completion];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [self tmuxNewWindowCommandInSessionNumber:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                           recyclingSupported:recyclingSupported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        scope:scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   completion:completion];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)tmuxSplitWindowCommand:(int)wp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermTmuxOptionMonitor.h sources/iTermTmuxOptionMonitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 147fcd6..8dffe52 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermTmuxOptionMonitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermTmuxOptionMonitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -18,8 +18,12 @@ NS_ASSUME_NONNULL_BEGIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property (nullable, nonatomic, strong) iTermVariableScope *scope;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (instancetype)init NS_UNAVAILABLE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// If `fallbackVariableName` is nonnil, the value of the variable named
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// `fallbackVariableName` will be used for tmux 2.8 and earlier.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (instancetype)initWithGateway:(TmuxGateway *)gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           fallbackVariableName:(nullable NSString *)fallbackVariableName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                          format:(NSString *)format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                          target:(NSString *)tmuxTarget
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    variableName:(nullable NSString *)variableName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermTmuxOptionMonitor.m sources/iTermTmuxOptionMonitor.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4f72d02..fd6120f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermTmuxOptionMonitor.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermTmuxOptionMonitor.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -10,6 +10,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "DebugLogging.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "iTermVariables.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "iTermVariableScope+Session.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "NSStringITerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "NSTimer+iTerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "TmuxGateway.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -19,11 +20,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     BOOL _haveOutstandingRequest;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *_target;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NSString *_variableName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *_fallbackVariableName;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void (^_block)(NSString *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (instancetype)initWithGateway:(TmuxGateway *)gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           scope:(iTermVariableScope *)scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           fallbackVariableName:(NSString *)fallbackVariableName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                          format:(NSString *)format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                          target:(NSString *)target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    variableName:(NSString *)variableName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,6 +39,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         _target = [target copy];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         _variableName = [variableName copy];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         _block = [block copy];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        _fallbackVariableName = [fallbackVariableName copy];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return self;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,13 +68,21 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self updateOnce];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- (NSString *)command {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return [NSString stringWithFormat:@"display-message -t '%@' -p '%@'", _target, self.escapedFormat];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)updateOnce {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (_haveOutstandingRequest) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         DLog(@"Not making a request because one is outstanding");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (_fallbackVariableName && self.gateway.minimumServerVersion.doubleValue <= 2.9) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        [self didFetch:[self.scope valueForVariableName:_fallbackVariableName]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _haveOutstandingRequest = YES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *command = [NSString stringWithFormat:@"display-message -t '%@' -p '%@'", _target, self.escapedFormat];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NSString *command = [self command];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DLog(@"Request option with command %@", command);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self.gateway sendCommand:command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                responseTarget:self
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,7 +92,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)didFetch:(NSString *)value {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    DLog(@"Did fetch %@", value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DLog(@"%@ -> %@", self.command, value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!value) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // Probably the pane went away and we'll be dealloced soon.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermTmuxSessionObject.h sources/iTermTmuxSessionObject.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0000000..6407d5f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermTmuxSessionObject.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,17 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  iTermTmuxSessionObject.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  iTerm2SharedARC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  Created by George Nachman on 9/25/19.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import <Foundation/Foundation.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NS_ASSUME_NONNULL_BEGIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@interface iTermTmuxSessionObject : NSObject
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@property (nonatomic, copy) NSString *name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@property (nonatomic) int number;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NS_ASSUME_NONNULL_END
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermTmuxSessionObject.m sources/iTermTmuxSessionObject.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0000000..5ac9130
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermTmuxSessionObject.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  iTermTmuxSessionObject.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  iTerm2SharedARC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  Created by George Nachman on 9/25/19.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "iTermTmuxSessionObject.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@implementation iTermTmuxSessionObject
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++@end
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermTmuxStatusBarMonitor.h sources/iTermTmuxStatusBarMonitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8172779..96338ec 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermTmuxStatusBarMonitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermTmuxStatusBarMonitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -14,6 +14,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NS_ASSUME_NONNULL_BEGIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// NOTE: Requires tmux 2.9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @interface iTermTmuxStatusBarMonitor : NSObject
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @property (nonatomic) BOOL active;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermTmuxStatusBarMonitor.m sources/iTermTmuxStatusBarMonitor.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 50504da..0d3daf3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermTmuxStatusBarMonitor.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermTmuxStatusBarMonitor.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -9,6 +9,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "DebugLogging.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "iTermVariableScope.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#import "NSStringITerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "NSTimer+iTerm.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "TmuxGateway.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #import "RegexKitLite.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -49,13 +50,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)requestUpdates {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _accelerated = NO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_gateway sendCommand:@"display-message -p \"#{status-left}\"" responseTarget:self responseSelector:@selector(handleStatusLeftResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_gateway sendCommand:@"display-message -p \"#{status-right}\"" responseTarget:self responseSelector:@selector(handleStatusRightResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (NSString *)escapedString:(NSString *)string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return [[string stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [_gateway sendCommand:@"display-message -p \"#{T:status-left}\"" responseTarget:self responseSelector:@selector(handleStatusLeftValueExpansionResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    [_gateway sendCommand:@"display-message -p \"#{T:status-right}\"" responseTarget:self responseSelector:@selector(handleStatusRightValueExpansionResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)handleStatusIntervalResponse:(NSString *)response {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -66,28 +62,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     _timer = [NSTimer scheduledWeakTimerWithTimeInterval:interval target:self selector:@selector(timerDidFire:) userInfo:nil repeats:YES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)handleStatusLeftResponse:(NSString *)response {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (!response) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *command = [NSString stringWithFormat:@"display-message -p \"%@\"", [self escapedString:response]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_gateway sendCommand:command responseTarget:self responseSelector:@selector(handleStatusLeftValueExpansionResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- (void)handleStatusRightResponse:(NSString *)response {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (!response) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NSString *command = [NSString stringWithFormat:@"display-message -p \"%@\"", [self escapedString:response]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    [_gateway sendCommand:command responseTarget:self responseSelector:@selector(handleStatusRightValueExpansionResponse:)];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)handleStatusLeftValueExpansionResponse:(NSString *)string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DLog(@"Left status bar is: %@", string);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self.scope setValue:[self sanitizedString:string] ?: @"" forVariableNamed:iTermVariableKeySessionTmuxStatusLeft];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self accelerateUpdateIfStringContainsNotReady:string];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - (void)handleStatusRightValueExpansionResponse:(NSString *)string {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DLog(@"Right status bar is: %@", string);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self.scope setValue:[self sanitizedString:string] ?: @"" forVariableNamed:iTermVariableKeySessionTmuxStatusRight];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     [self accelerateUpdateIfStringContainsNotReady:string];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git sources/iTermWorkingDirectoryPoller.m sources/iTermWorkingDirectoryPoller.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5271227..f4d8602 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- sources/iTermWorkingDirectoryPoller.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ sources/iTermWorkingDirectoryPoller.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -37,6 +37,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         __weak __typeof(self) weakSelf = self;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         _tmuxOptionMonitor = [[iTermTmuxOptionMonitor alloc] initWithGateway:gateway
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                        scope:scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                        fallbackVariableName:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                       format:@"#{pane_current_path}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                       target:[NSString stringWithFormat:@"%%%@", @(windowPane)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                 variableName:nil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.23.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>