You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by bi...@apache.org on 2018/12/07 18:56:45 UTC

[5/5] hadoop git commit: YARN-8914. Add xtermjs to YARN UI2. Contributed by Eric Yang and Akhil PB

YARN-8914. Add xtermjs to YARN UI2. Contributed by Eric Yang and Akhil PB


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/154449fb
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/154449fb
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/154449fb

Branch: refs/heads/trunk
Commit: 154449fbd80d1b357063ec675d12b17b6c6e20fc
Parents: cc51607
Author: Billie Rinaldi <bi...@apache.org>
Authored: Fri Dec 7 10:55:13 2018 -0800
Committer: Billie Rinaldi <bi...@apache.org>
Committed: Fri Dec 7 10:56:17 2018 -0800

----------------------------------------------------------------------
 LICENSE.txt                                     |   33 +
 NOTICE.txt                                      |    7 +
 .../hadoop-client-minicluster/pom.xml           |    8 +
 .../hadoop-yarn-server-nodemanager/pom.xml      |    1 +
 .../nodemanager/webapp/TerminalServlet.java     |   49 +
 .../server/nodemanager/webapp/WebServer.java    |    9 +-
 .../src/main/resources/TERMINAL/css/style.css   |   33 +
 .../main/resources/TERMINAL/terminal.template   |  110 +
 .../TERMINAL/xterm/dist/addons/attach/attach.js |  104 +
 .../xterm/dist/addons/attach/attach.js.map      |    1 +
 .../TERMINAL/xterm/dist/addons/fit/fit.js       |   51 +
 .../TERMINAL/xterm/dist/addons/fit/fit.js.map   |    1 +
 .../xterm/dist/addons/fullscreen/fullscreen.css |   10 +
 .../xterm/dist/addons/fullscreen/fullscreen.js  |   27 +
 .../dist/addons/fullscreen/fullscreen.js.map    |    1 +
 .../TERMINAL/xterm/dist/addons/search/search.js |  166 +
 .../xterm/dist/addons/search/search.js.map      |    1 +
 .../xterm/dist/addons/terminado/terminado.js    |   69 +
 .../dist/addons/terminado/terminado.js.map      |    1 +
 .../xterm/dist/addons/webLinks/webLinks.js      |   41 +
 .../xterm/dist/addons/webLinks/webLinks.js.map  |    1 +
 .../dist/addons/winptyCompat/winptyCompat.js    |   31 +
 .../addons/winptyCompat/winptyCompat.js.map     |    1 +
 .../TERMINAL/xterm/dist/addons/zmodem/zmodem.js |   45 +
 .../xterm/dist/addons/zmodem/zmodem.js.map      |    1 +
 .../resources/TERMINAL/xterm/dist/xterm.css     |  164 +
 .../main/resources/TERMINAL/xterm/dist/xterm.js | 8907 ++++++++++++++++++
 .../resources/TERMINAL/xterm/dist/xterm.js.map  |    1 +
 .../nodemanager/webapp/TestNMWebTerminal.java   |  124 +
 .../hadoop-yarn/hadoop-yarn-ui/pom.xml          |   41 +
 .../main/webapp/app/components/timeline-view.js |   19 +-
 .../main/webapp/app/models/yarn-container.js    |    2 +-
 .../app/models/yarn-timeline-container.js       |    2 +-
 .../main/webapp/app/routes/yarn-app-attempt.js  |    5 +
 .../templates/components/container-table.hbs    |    6 +
 .../app/templates/components/timeline-view.hbs  |    2 +-
 .../webapp/app/templates/yarn-app-attempt.hbs   |    1 +
 37 files changed, 10070 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/LICENSE.txt
----------------------------------------------------------------------
diff --git a/LICENSE.txt b/LICENSE.txt
index dd7195e..a01cff4 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -2793,6 +2793,38 @@ available under the Creative Commons By Attribution 3.0 License.
         this trademark restriction does not form part of this License.
 
         Creative Commons may be contacted at https://creativecommons.org/.
+
+--------------------------------------------------------------------------------
+
+For: /hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server
+/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL
+
+xterm.js 3.8.0
+The source and binary distribution of this product bundles these dependencies
+under the following license:
+
+Copyright (c) 2017-2018, The xterm.js authors (https://github.com/xtermjs/xterm.js)
+Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com)
+Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
 --------------------------------------------------------------------------------
 
 For: hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs
@@ -2815,6 +2847,7 @@ License for the specific language governing permissions and limitations under
 the License.
 
 --------------------------------------------------------------------------------
+
 Jline 3.9.0
 The binary distribution of this product bundles these dependencies under the
 following license:

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/NOTICE.txt
----------------------------------------------------------------------
diff --git a/NOTICE.txt b/NOTICE.txt
index 5553144..b4329b8 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -614,6 +614,13 @@ which has the following notices:
    Expert Group and released to the public domain, as explained at
    http://creativecommons.org/publicdomain/zero/1.0/
 
+The source and binary distribution of this product bundles binaries of
+xterm.js 3.8.0
+which has the following notices:
+Copyright (c) 2017-2018, The xterm.js authors (https://github.com/xtermjs/xterm.js)
+Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com)
+Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/)
+
 The source and binary distribution of this product bundles modified version of
   github.com/awslabs/aws-js-s3-explorer licensed under Apache 2.0 license
   with the following notice:

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-client-modules/hadoop-client-minicluster/pom.xml
----------------------------------------------------------------------
diff --git a/hadoop-client-modules/hadoop-client-minicluster/pom.xml b/hadoop-client-modules/hadoop-client-minicluster/pom.xml
index 0b820b6..5ceb2c0 100644
--- a/hadoop-client-modules/hadoop-client-minicluster/pom.xml
+++ b/hadoop-client-modules/hadoop-client-minicluster/pom.xml
@@ -719,6 +719,14 @@
                         <exclude>testdata/*</exclude>
                       </excludes>
                     </filter>
+                    <!-- Skip terminal html and javascript -->
+                    <filter>
+                      <artifact>org.apache.hadoop:hadoop-yarn-server-nodemanager:*</artifact>
+                      <excludes>
+                        <exclude>TERMINAL/**/*</exclude>
+                      </excludes>
+                    </filter>
+
                     <!-- Mockito tries to include its own unrelocated copy of hamcrest. :( -->
                     <filter>
                       <artifact>org.mockito:mockito-all</artifact>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
index 6242215..5a70f61 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml
@@ -350,6 +350,7 @@
             <exclude>src/main/native/container-executor/impl/compat/fstatat.h</exclude>
             <exclude>src/main/native/container-executor/impl/compat/openat.h</exclude>
             <exclude>src/main/native/container-executor/impl/compat/unlinkat.h</exclude>
+            <exclude>src/main/resources/TERMINAL/xterm/**/*</exclude>
           </excludes>
         </configuration>
       </plugin>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TerminalServlet.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TerminalServlet.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TerminalServlet.java
new file mode 100644
index 0000000..ec1f9be
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/TerminalServlet.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.yarn.server.nodemanager.webapp;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.servlet.DefaultServlet;
+
+/**
+ * TerminalServlet host the static html and javascript for
+ * connecting to a text terminal over websocket.
+ */
+@WebServlet(urlPatterns="/terminal/*")
+public class TerminalServlet extends DefaultServlet {
+
+  /**
+   * Servlet for hosting html page for xtermjs.
+   */
+  private static final long serialVersionUID = 1336699L;
+
+  @Override
+  protected void doGet(HttpServletRequest request, HttpServletResponse response)
+      throws ServletException, IOException {
+    if (request.getRequestURI().endsWith(".template")) {
+      response.setHeader("Content-Type", "text/html;charset=utf-8");
+    }
+    super.doGet(request, response);
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
index 84c5d08..eab20ac 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/webapp/WebServer.java
@@ -67,6 +67,11 @@ public class WebServer extends AbstractService {
   protected void serviceStart() throws Exception {
     Configuration conf = getConfig();
     Map<String, String> params = new HashMap<String, String>();
+    Map<String, String> terminalParams = new HashMap<String, String>();
+    terminalParams.put("resourceBase", WebServer.class
+        .getClassLoader().getResource("TERMINAL").toExternalForm());
+    terminalParams.put("dirAllowed", "false");
+    terminalParams.put("pathInfoOnly", "true");
     String bindAddress = WebAppUtils.getWebAppBindURL(conf,
                           YarnConfiguration.NM_BIND_HOST,
                           WebAppUtils.getNMWebAppURLWithoutScheme(conf));
@@ -107,7 +112,9 @@ public class WebServer extends AbstractService {
             .$for("node", Context.class, this.nmContext, "ws")
             .at(bindAddress)
             .withServlet("ContainerShellWebSocket", "/container/*",
-              ContainerShellWebSocketServlet.class, params, false)
+                ContainerShellWebSocketServlet.class, params, false)
+            .withServlet("Terminal", "/terminal/*",
+                TerminalServlet.class, terminalParams, false)
             .with(conf)
             .withHttpSpnegoPrincipalKey(
               YarnConfiguration.NM_WEBAPP_SPNEGO_USER_NAME_KEY)

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/css/style.css
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/css/style.css b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/css/style.css
new file mode 100644
index 0000000..9f1643c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/css/style.css
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+html {
+  height: 100%;
+}
+
+body {
+  background-color: #2B2B2B;
+  height: 100%;
+}
+
+.container {
+  height: 100%;
+}
+
+#terminal-container {
+  height: 100%;
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/terminal.template
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/terminal.template b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/terminal.template
new file mode 100644
index 0000000..004e8e27
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/terminal.template
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+  <html>
+    <head>
+      <meta charset="utf-8"/>
+      <link rel="stylesheet" href="xterm/dist/xterm.css" />
+      <link rel="stylesheet" href="css/style.css" />
+      <script src="xterm/dist/xterm.js"></script>
+      <script src="xterm/dist/addons/attach/attach.js"></script>
+      <script src="xterm/dist/addons/fit/fit.js"></script>
+      <script src="xterm/dist/addons/winptyCompat/winptyCompat.js"></script>
+      <script src="xterm/dist/addons/fullscreen/fullscreen.js"></script>
+    </head>
+    <body>
+      <div class="container">
+        <div id="terminal-container"></div>
+      </div>
+      <script>
+        function getQueryVariable(variable) {
+          var query = window.location.search.substring(1);
+          var vars = query.split('&');
+          for (var i = 0; i < vars.length; i++) {
+            var pair = vars[i].split('=');
+            if (decodeURIComponent(pair[0]) == variable) {
+              return decodeURIComponent(pair[1]);
+            }
+          }
+          return null;
+        }
+
+        Terminal.applyAddon(attach);
+        Terminal.applyAddon(fit);
+        Terminal.applyAddon(winptyCompat);
+        Terminal.applyAddon(fullscreen);
+        var term = new Terminal({
+                fontSize: 13,
+                fontFamily: '"Menlo for Powerline", Menlo, Consolas, "Liberation Mono", Courier, monospace',
+                theme: {
+                    foreground: '#d2d2d2',
+                    background: '#2b2b2b',
+                    cursor: '#adadad',
+                    black: '#000000',
+                    red: '#d81e00',
+                    green: '#5ea702',
+                    yellow: '#cfae00',
+                    blue: '#427ab3',
+                    magenta: '#89658e',
+                    cyan: '#00a7aa',
+                    white: '#dbded8',
+                    brightBlack: '#686a66',
+                    brightRed: '#f54235',
+                    brightGreen: '#99e343',
+                    brightYellow: '#fdeb61',
+                    brightBlue: '#84b0d8',
+                    brightMagenta: '#bc94b7',
+                    brightCyan: '#37e6e8',
+                    brightWhite: '#f1f1f0'
+                }
+            }),
+            container = document.getElementById('terminal-container'),
+            socketUrl = document.getElementById('socket-url'),
+            socketForm = document.getElementById('socket-form');
+
+        var arr = window.location.href.split("/");
+        var protocol = "ws://";
+        if (window.location.protocol=="https:") {
+          protocol = "wss://";
+        }
+        var url = "ws://" + window.location.hostname + ":" + window.location.port
+            + "/container/" + getQueryVariable("container");
+        var user = getQueryVariable("user.name");
+        if (user != null) {
+          url = url + "?user.name=" + encodeURI(user);
+        }
+        console.log(url);
+        var sock = new WebSocket(url);
+        sock.addEventListener('open', function () {
+          term.attach(sock, true, true);
+        });
+        term.open(container);
+        term.winptyCompatInit();
+        term.fit();
+        term.toggleFullScreen(true);
+        term.focus();
+        function ping() {
+          if (sock.readyState === WebSocket.OPEN) {
+            sock.send("1{}");
+          } else if(sock.readyState === WebSocket.CLOSED) {
+            clearInterval(pingTimer);
+          }
+        }
+        var pingTimer = setInterval(ping, 100);
+      </script>
+    </body>
+  </html>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js
new file mode 100644
index 0000000..939e71b
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js
@@ -0,0 +1,104 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.attach = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function attach(term, socket, bidirectional, buffered) {
+    var addonTerminal = term;
+    bidirectional = (typeof bidirectional === 'undefined') ? true : bidirectional;
+    addonTerminal.__socket = socket;
+    addonTerminal.__flushBuffer = function () {
+        addonTerminal.write(addonTerminal.__attachSocketBuffer);
+        addonTerminal.__attachSocketBuffer = null;
+    };
+    addonTerminal.__pushToBuffer = function (data) {
+        if (addonTerminal.__attachSocketBuffer) {
+            addonTerminal.__attachSocketBuffer += data;
+        }
+        else {
+            addonTerminal.__attachSocketBuffer = data;
+            setTimeout(addonTerminal.__flushBuffer, 10);
+        }
+    };
+    var myTextDecoder;
+    addonTerminal.__getMessage = function (ev) {
+        var str;
+        if (typeof ev.data === 'object') {
+            if (!myTextDecoder) {
+                myTextDecoder = new TextDecoder();
+            }
+            if (ev.data instanceof ArrayBuffer) {
+                str = myTextDecoder.decode(ev.data);
+                displayData(str);
+            }
+            else {
+                var fileReader_1 = new FileReader();
+                fileReader_1.addEventListener('load', function () {
+                    str = myTextDecoder.decode(fileReader_1.result);
+                    displayData(str);
+                });
+                fileReader_1.readAsArrayBuffer(ev.data);
+            }
+        }
+        else if (typeof ev.data === 'string') {
+            displayData(ev.data);
+        }
+        else {
+            throw Error("Cannot handle \"" + typeof ev.data + "\" websocket message.");
+        }
+    };
+    function displayData(str, data) {
+        if (buffered) {
+            addonTerminal.__pushToBuffer(str || data);
+        }
+        else {
+            addonTerminal.write(str || data);
+        }
+    }
+    addonTerminal.__sendData = function (data) {
+        if (socket.readyState !== 1) {
+            return;
+        }
+        socket.send(data);
+    };
+    addonTerminal._core.register(addSocketListener(socket, 'message', addonTerminal.__getMessage));
+    if (bidirectional) {
+        addonTerminal._core.register(addonTerminal.addDisposableListener('data', addonTerminal.__sendData));
+    }
+    addonTerminal._core.register(addSocketListener(socket, 'close', function () { return detach(addonTerminal, socket); }));
+    addonTerminal._core.register(addSocketListener(socket, 'error', function () { return detach(addonTerminal, socket); }));
+}
+exports.attach = attach;
+function addSocketListener(socket, type, handler) {
+    socket.addEventListener(type, handler);
+    return {
+        dispose: function () {
+            if (!handler) {
+                return;
+            }
+            socket.removeEventListener(type, handler);
+            handler = null;
+        }
+    };
+}
+function detach(term, socket) {
+    var addonTerminal = term;
+    addonTerminal.off('data', addonTerminal.__sendData);
+    socket = (typeof socket === 'undefined') ? addonTerminal.__socket : socket;
+    if (socket) {
+        socket.removeEventListener('message', addonTerminal.__getMessage);
+    }
+    delete addonTerminal.__socket;
+}
+exports.detach = detach;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.attach = function (socket, bidirectional, buffered) {
+        attach(this, socket, bidirectional, buffered);
+    };
+    terminalConstructor.prototype.detach = function (socket) {
+        detach(this, socket);
+    };
+}
+exports.apply = apply;
+
+},{}]},{},[1])(1)
+});
+//# sourceMappingURL=attach.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js.map
new file mode 100644
index 0000000..ac164ec
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/attach/attach.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"attach.js","sources":["../../../src/addons/attach/attach.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Implements the attach method, that attaches the terminal to a WebSocket stream.\n */\n\nimport { Terminal, IDisposable } from 'xterm';\nimport { IAttachAddonTerminal } from './Interfaces';\n\n/**\n * Attaches the given terminal to the given socket.\n *\n * @param term The terminal to be attached to the given socket.\n * @param socket The socket to attach the current terminal.\n * @param bidirectional Whether the terminal should send data to the socket as well.\n * @param buffered Whether the rendering of incoming data should happen instantly or at a maximum\n * frequency of 1 rendering per 10ms.\n */\nexport function attach(term: Terminal, socket: WebSocket, bidirectional: boolean, buffered: boolean): void {\n  const addonTerminal = <IAttach
 AddonTerminal>term;\n  bidirectional = (typeof bidirectional === 'undefined') ? true : bidirectional;\n  addonTerminal.__socket = socket;\n\n  addonTerminal.__flushBuffer = () => {\n    addonTerminal.write(addonTerminal.__attachSocketBuffer);\n    addonTerminal.__attachSocketBuffer = null;\n  };\n\n  addonTerminal.__pushToBuffer = (data: string) => {\n    if (addonTerminal.__attachSocketBuffer) {\n      addonTerminal.__attachSocketBuffer += data;\n    } else {\n      addonTerminal.__attachSocketBuffer = data;\n      setTimeout(addonTerminal.__flushBuffer, 10);\n    }\n  };\n\n  // TODO: This should be typed but there seem to be issues importing the type\n  let myTextDecoder: any;\n\n  addonTerminal.__getMessage = function(ev: MessageEvent): void {\n    let str: string;\n\n    if (typeof ev.data === 'object') {\n      if (!myTextDecoder) {\n        myTextDecoder = new TextDecoder();\n      }\n      if (ev.data instanceof ArrayBuffer) {\n        str = myTextDecoder.decode(ev.data);\n 
        displayData(str);\n      } else {\n        const fileReader = new FileReader();\n\n        fileReader.addEventListener('load', () => {\n          str = myTextDecoder.decode(fileReader.result);\n          displayData(str);\n        });\n        fileReader.readAsArrayBuffer(ev.data);\n      }\n    } else if (typeof ev.data === 'string') {\n      displayData(ev.data);\n    } else {\n      throw Error(`Cannot handle \"${typeof ev.data}\" websocket message.`);\n    }\n  };\n\n  /**\n  * Push data to buffer or write it in the terminal.\n  * This is used as a callback for FileReader.onload.\n  *\n  * @param str String decoded by FileReader.\n  * @param data The data of the EventMessage.\n  */\n  function displayData(str?: string, data?: string): void {\n    if (buffered) {\n      addonTerminal.__pushToBuffer(str || data);\n    } else {\n      addonTerminal.write(str || data);\n    }\n  }\n\n  addonTerminal.__sendData = (data: string) => {\n    if (socket.readyState !== 1) {\n      r
 eturn;\n    }\n    socket.send(data);\n  };\n\n  addonTerminal._core.register(addSocketListener(socket, 'message', addonTerminal.__getMessage));\n\n  if (bidirectional) {\n    addonTerminal._core.register(addonTerminal.addDisposableListener('data', addonTerminal.__sendData));\n  }\n\n  addonTerminal._core.register(addSocketListener(socket, 'close', () => detach(addonTerminal, socket)));\n  addonTerminal._core.register(addSocketListener(socket, 'error', () => detach(addonTerminal, socket)));\n}\n\nfunction addSocketListener(socket: WebSocket, type: string, handler: (this: WebSocket, ev: Event) => any): IDisposable {\n  socket.addEventListener(type, handler);\n  return {\n    dispose: () => {\n      if (!handler) {\n        // Already disposed\n        return;\n      }\n      socket.removeEventListener(type, handler);\n      handler = null;\n    }\n  };\n}\n\n/**\n * Detaches the given terminal from the given socket\n *\n * @param term The terminal to be detached from the given socket
 .\n * @param socket The socket from which to detach the current terminal.\n */\nexport function detach(term: Terminal, socket: WebSocket): void {\n  const addonTerminal = <IAttachAddonTerminal>term;\n  addonTerminal.off('data', addonTerminal.__sendData);\n\n  socket = (typeof socket === 'undefined') ? addonTerminal.__socket : socket;\n\n  if (socket) {\n    socket.removeEventListener('message', addonTerminal.__getMessage);\n  }\n\n  delete addonTerminal.__socket;\n}\n\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  /**\n   * Attaches the current terminal to the given socket\n   *\n   * @param socket The socket to attach the current terminal.\n   * @param bidirectional Whether the terminal should send data to the socket as well.\n   * @param buffered Whether the rendering of incoming data should happen instantly or at a maximum\n   * frequency of 1 rendering per 10ms.\n   */\n  (<any>terminalConstructor.prototype).attach = function (socket: WebSocket, bidire
 ctional: boolean, buffered: boolean): void {\n    attach(this, socket, bidirectional, buffered);\n  };\n\n  /**\n   * Detaches the current terminal from the given socket.\n   *\n   * @param socket The socket from which to detach the current terminal.\n   */\n  (<any>terminalConstructor.prototype).detach = function (socket: WebSocket): void {\n    detach(this, socket);\n  };\n}\n",null],"names":[],"mappings":"ACAA;;;ADmBA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AA9EA;AAgFA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAXA;AAcA;AASA;AACA;AACA;AAOA;AACA;AACA;AACA;AArBA;"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js
new file mode 100644
index 0000000..b137d99
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js
@@ -0,0 +1,51 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.fit = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function proposeGeometry(term) {
+    if (!term.element.parentElement) {
+        return null;
+    }
+    var parentElementStyle = window.getComputedStyle(term.element.parentElement);
+    var parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));
+    var parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')));
+    var elementStyle = window.getComputedStyle(term.element);
+    var elementPadding = {
+        top: parseInt(elementStyle.getPropertyValue('padding-top')),
+        bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')),
+        right: parseInt(elementStyle.getPropertyValue('padding-right')),
+        left: parseInt(elementStyle.getPropertyValue('padding-left'))
+    };
+    var elementPaddingVer = elementPadding.top + elementPadding.bottom;
+    var elementPaddingHor = elementPadding.right + elementPadding.left;
+    var availableHeight = parentElementHeight - elementPaddingVer;
+    var availableWidth = parentElementWidth - elementPaddingHor - term._core.viewport.scrollBarWidth;
+    var geometry = {
+        cols: Math.floor(availableWidth / term._core.renderer.dimensions.actualCellWidth),
+        rows: Math.floor(availableHeight / term._core.renderer.dimensions.actualCellHeight)
+    };
+    return geometry;
+}
+exports.proposeGeometry = proposeGeometry;
+function fit(term) {
+    var geometry = proposeGeometry(term);
+    if (geometry) {
+        if (term.rows !== geometry.rows || term.cols !== geometry.cols) {
+            term._core.renderer.clear();
+            term.resize(geometry.cols, geometry.rows);
+        }
+    }
+}
+exports.fit = fit;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.proposeGeometry = function () {
+        return proposeGeometry(this);
+    };
+    terminalConstructor.prototype.fit = function () {
+        fit(this);
+    };
+}
+exports.apply = apply;
+
+},{}]},{},[1])(1)
+});
+//# sourceMappingURL=fit.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js.map
new file mode 100644
index 0000000..5f1042e
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fit/fit.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"fit.js","sources":["../../../src/addons/fit/fit.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Fit terminal columns and rows to the dimensions of its DOM element.\n *\n * ## Approach\n *\n *    Rows: Truncate the division of the terminal parent element height by the\n *          terminal row height.\n * Columns: Truncate the division of the terminal parent element width by the\n *          terminal character width (apply display: inline at the terminal\n *          row and truncate its width with the current number of columns).\n */\n\nimport { Terminal } from 'xterm';\n\nexport interface IGeometry {\n  rows: number;\n  cols: number;\n}\n\nexport function proposeGeometry(term: Terminal): IGeometry {\n  if (!term.element.parentElement) {\n    return null;\n  }\n  const parentElementStyle = window.getComputedStyle(term.element.parentElement);\n 
  const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));\n  const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')));\n  const elementStyle = window.getComputedStyle(term.element);\n  const elementPadding = {\n    top: parseInt(elementStyle.getPropertyValue('padding-top')),\n    bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')),\n    right: parseInt(elementStyle.getPropertyValue('padding-right')),\n    left: parseInt(elementStyle.getPropertyValue('padding-left'))\n  };\n  const elementPaddingVer = elementPadding.top + elementPadding.bottom;\n  const elementPaddingHor = elementPadding.right + elementPadding.left;\n  const availableHeight = parentElementHeight - elementPaddingVer;\n  const availableWidth = parentElementWidth - elementPaddingHor - (<any>term)._core.viewport.scrollBarWidth;\n  const geometry = {\n    cols: Math.floor(availableWidth / (<any>term)._core.renderer.dimensions.actualCellWidth),
 \n    rows: Math.floor(availableHeight / (<any>term)._core.renderer.dimensions.actualCellHeight)\n  };\n  return geometry;\n}\n\nexport function fit(term: Terminal): void {\n  const geometry = proposeGeometry(term);\n  if (geometry) {\n    // Force a full render\n    if (term.rows !== geometry.rows || term.cols !== geometry.cols) {\n      (<any>term)._core.renderer.clear();\n      term.resize(geometry.cols, geometry.rows);\n    }\n  }\n}\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  (<any>terminalConstructor.prototype).proposeGeometry = function (): IGeometry {\n    return proposeGeometry(this);\n  };\n\n  (<any>terminalConstructor.prototype).fit = function (): void {\n    fit(this);\n  };\n}\n",null],"names":[],"mappings":"ACAA;;;ADsBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAvBA;AAyBA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AATA;AAWA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AARA;"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.css
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.css b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.css
new file mode 100644
index 0000000..60e8c51
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.css
@@ -0,0 +1,10 @@
+.xterm.fullscreen {
+    position: fixed;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    width: auto;
+    height: auto;
+    z-index: 255;
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js
new file mode 100644
index 0000000..d12b72e
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js
@@ -0,0 +1,27 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.fullscreen = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function toggleFullScreen(term, fullscreen) {
+    var fn;
+    if (typeof fullscreen === 'undefined') {
+        fn = (term.element.classList.contains('fullscreen')) ? 'remove' : 'add';
+    }
+    else if (!fullscreen) {
+        fn = 'remove';
+    }
+    else {
+        fn = 'add';
+    }
+    term.element.classList[fn]('fullscreen');
+}
+exports.toggleFullScreen = toggleFullScreen;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.toggleFullScreen = function (fullscreen) {
+        toggleFullScreen(this, fullscreen);
+    };
+}
+exports.apply = apply;
+
+},{}]},{},[1])(1)
+});
+//# sourceMappingURL=fullscreen.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js.map
new file mode 100644
index 0000000..dafbbe6
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/fullscreen/fullscreen.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"fullscreen.js","sources":["../../../src/addons/fullscreen/fullscreen.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal } from 'xterm';\n\n/**\n * Toggle the given terminal's fullscreen mode.\n * @param term The terminal to toggle full screen mode\n * @param fullscreen Toggle fullscreen on (true) or off (false)\n */\nexport function toggleFullScreen(term: Terminal, fullscreen: boolean): void {\n  let fn: string;\n\n  if (typeof fullscreen === 'undefined') {\n    fn = (term.element.classList.contains('fullscreen')) ? 'remove' : 'add';\n  } else if (!fullscreen) {\n    fn = 'remove';\n  } else {\n    fn = 'add';\n  }\n\n  term.element.classList[fn]('fullscreen');\n}\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  (<any>terminalConstructor.prototype).toggleFullScreen = function (fullscreen: boolean): void {
 \n    toggleFullScreen(this, fullscreen);\n  };\n}\n",null],"names":[],"mappings":"ACAA;;;ADYA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AAZA;AAcA;AACA;AACA;AACA;AACA;AAJA;"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js
new file mode 100644
index 0000000..9cf396b
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js
@@ -0,0 +1,166 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.search = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var nonWordCharacters = ' ~!@#$%^&*()_+`-=[]{}|\;:"\',./<>?';
+var SearchHelper = (function () {
+    function SearchHelper(_terminal) {
+        this._terminal = _terminal;
+    }
+    SearchHelper.prototype.findNext = function (term, searchOptions) {
+        if (!term || term.length === 0) {
+            return false;
+        }
+        var result;
+        var startRow = this._terminal._core.buffer.ydisp;
+        if (this._terminal._core.selectionManager.selectionEnd) {
+            startRow = this._terminal._core.selectionManager.selectionEnd[1];
+        }
+        for (var y = startRow + 1; y < this._terminal._core.buffer.ybase + this._terminal.rows; y++) {
+            result = this._findInLine(term, y, searchOptions);
+            if (result) {
+                break;
+            }
+        }
+        if (!result) {
+            for (var y = 0; y < startRow; y++) {
+                result = this._findInLine(term, y, searchOptions);
+                if (result) {
+                    break;
+                }
+            }
+        }
+        return this._selectResult(result);
+    };
+    SearchHelper.prototype.findPrevious = function (term, searchOptions) {
+        if (!term || term.length === 0) {
+            return false;
+        }
+        var result;
+        var startRow = this._terminal._core.buffer.ydisp;
+        if (this._terminal._core.selectionManager.selectionStart) {
+            startRow = this._terminal._core.selectionManager.selectionStart[1];
+        }
+        for (var y = startRow - 1; y >= 0; y--) {
+            result = this._findInLine(term, y, searchOptions);
+            if (result) {
+                break;
+            }
+        }
+        if (!result) {
+            for (var y = this._terminal._core.buffer.ybase + this._terminal.rows - 1; y > startRow; y--) {
+                result = this._findInLine(term, y, searchOptions);
+                if (result) {
+                    break;
+                }
+            }
+        }
+        return this._selectResult(result);
+    };
+    SearchHelper.prototype._isWholeWord = function (searchIndex, line, term) {
+        return (((searchIndex === 0) || (nonWordCharacters.indexOf(line[searchIndex - 1]) !== -1)) &&
+            (((searchIndex + term.length) === line.length) || (nonWordCharacters.indexOf(line[searchIndex + term.length]) !== -1)));
+    };
+    SearchHelper.prototype._findInLine = function (term, y, searchOptions) {
+        if (searchOptions === void 0) { searchOptions = {}; }
+        if (this._terminal._core.buffer.lines.get(y).isWrapped) {
+            return;
+        }
+        var stringLine = this.translateBufferLineToStringWithWrap(y, true);
+        var searchStringLine = searchOptions.caseSensitive ? stringLine : stringLine.toLowerCase();
+        var searchTerm = searchOptions.caseSensitive ? term : term.toLowerCase();
+        var searchIndex = -1;
+        if (searchOptions.regex) {
+            var searchRegex = RegExp(searchTerm, 'g');
+            var foundTerm = searchRegex.exec(searchStringLine);
+            if (foundTerm && foundTerm[0].length > 0) {
+                searchIndex = searchRegex.lastIndex - foundTerm[0].length;
+                term = foundTerm[0];
+            }
+        }
+        else {
+            searchIndex = searchStringLine.indexOf(searchTerm);
+        }
+        if (searchIndex >= 0) {
+            if (searchIndex >= this._terminal.cols) {
+                y += Math.floor(searchIndex / this._terminal.cols);
+                searchIndex = searchIndex % this._terminal.cols;
+            }
+            if (searchOptions.wholeWord && !this._isWholeWord(searchIndex, searchStringLine, term)) {
+                return;
+            }
+            var line = this._terminal._core.buffer.lines.get(y);
+            for (var i = 0; i < searchIndex; i++) {
+                var charData = line.get(i);
+                var char = charData[1];
+                if (char.length > 1) {
+                    searchIndex -= char.length - 1;
+                }
+                var charWidth = charData[2];
+                if (charWidth === 0) {
+                    searchIndex++;
+                }
+            }
+            return {
+                term: term,
+                col: searchIndex,
+                row: y
+            };
+        }
+    };
+    SearchHelper.prototype.translateBufferLineToStringWithWrap = function (lineIndex, trimRight) {
+        var lineString = '';
+        var lineWrapsToNext;
+        do {
+            var nextLine = this._terminal._core.buffer.lines.get(lineIndex + 1);
+            lineWrapsToNext = nextLine ? nextLine.isWrapped : false;
+            lineString += this._terminal._core.buffer.translateBufferLineToString(lineIndex, !lineWrapsToNext && trimRight);
+            lineIndex++;
+        } while (lineWrapsToNext);
+        return lineString;
+    };
+    SearchHelper.prototype._selectResult = function (result) {
+        if (!result) {
+            return false;
+        }
+        this._terminal._core.selectionManager.setSelection(result.col, result.row, result.term.length);
+        this._terminal.scrollLines(result.row - this._terminal._core.buffer.ydisp);
+        return true;
+    };
+    return SearchHelper;
+}());
+exports.SearchHelper = SearchHelper;
+
+},{}],2:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var SearchHelper_1 = require("./SearchHelper");
+function findNext(terminal, term, searchOptions) {
+    if (searchOptions === void 0) { searchOptions = {}; }
+    var addonTerminal = terminal;
+    if (!addonTerminal.__searchHelper) {
+        addonTerminal.__searchHelper = new SearchHelper_1.SearchHelper(addonTerminal);
+    }
+    return addonTerminal.__searchHelper.findNext(term, searchOptions);
+}
+exports.findNext = findNext;
+function findPrevious(terminal, term, searchOptions) {
+    var addonTerminal = terminal;
+    if (!addonTerminal.__searchHelper) {
+        addonTerminal.__searchHelper = new SearchHelper_1.SearchHelper(addonTerminal);
+    }
+    return addonTerminal.__searchHelper.findPrevious(term, searchOptions);
+}
+exports.findPrevious = findPrevious;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.findNext = function (term, searchOptions) {
+        return findNext(this, term, searchOptions);
+    };
+    terminalConstructor.prototype.findPrevious = function (term, searchOptions) {
+        return findPrevious(this, term, searchOptions);
+    };
+}
+exports.apply = apply;
+
+},{"./SearchHelper":1}]},{},[2])(2)
+});
+//# sourceMappingURL=search.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js.map
new file mode 100644
index 0000000..0989f46
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/search/search.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"search.js","sources":["../../../src/addons/search/search.ts","../../../src/addons/search/SearchHelper.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { SearchHelper } from './SearchHelper';\nimport { Terminal } from 'xterm';\nimport { ISearchAddonTerminal, ISearchOptions } from './Interfaces';\n\n/**\n * Find the next instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term Tne search term.\n * @param searchOptions Search options\n * @return Whether a result was found.\n */\nexport function findNext(terminal: Terminal, term: string, searchOptions: ISearchOptions = {}): boolean {\n  const addonTerminal = <ISearchAddonTerminal>terminal;\n  if (!addonTerminal.__searchHelper) {\n    addonTerminal.__searchHelper = new SearchHelper(addonTerminal);\n  }\n  return addonTerminal.__searchHelper.findN
 ext(term, searchOptions);\n}\n\n/**\n * Find the previous instance of the term, then scroll to and select it. If it\n * doesn't exist, do nothing.\n * @param term Tne search term.\n * @param searchOptions Search options\n * @return Whether a result was found.\n */\nexport function findPrevious(terminal: Terminal, term: string, searchOptions: ISearchOptions): boolean {\n  const addonTerminal = <ISearchAddonTerminal>terminal;\n  if (!addonTerminal.__searchHelper) {\n    addonTerminal.__searchHelper = new SearchHelper(addonTerminal);\n  }\n  return addonTerminal.__searchHelper.findPrevious(term, searchOptions);\n}\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  (<any>terminalConstructor.prototype).findNext = function(term: string, searchOptions: ISearchOptions): boolean {\n    return findNext(this, term, searchOptions);\n  };\n\n  (<any>terminalConstructor.prototype).findPrevious = function(term: string, searchOptions: ISearchOptions): boolean {\n    return fi
 ndPrevious(this, term, searchOptions);\n  };\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISearchHelper, ISearchAddonTerminal, ISearchOptions, ISearchResult } from './Interfaces';\nconst nonWordCharacters = ' ~!@#$%^&*()_+`-=[]{}|\\;:\"\\',./<>?';\n\n/**\n * A class that knows how to search the terminal and how to display the results.\n */\nexport class SearchHelper implements ISearchHelper {\n  constructor(private _terminal: ISearchAddonTerminal) {\n    // TODO: Search for multiple instances on 1 line\n    // TODO: Don't use the actual selection, instead use a \"find selection\" so multiple instances can be highlighted\n    // TODO: Highlight other instances in the viewport\n  }\n\n  /**\n   * Find the next instance of the term, then scroll to and select it. If it\n   * doesn't exist, do nothing.\n   * @param term Tne search term.\n   * @param searchOptions Search options.\n   * @return Whether a result was found.\n 
   */\n  public findNext(term: string, searchOptions?: ISearchOptions): boolean {\n    if (!term || term.length === 0) {\n      return false;\n    }\n\n    let result: ISearchResult;\n\n    let startRow = this._terminal._core.buffer.ydisp;\n    if (this._terminal._core.selectionManager.selectionEnd) {\n      // Start from the selection end if there is a selection\n      startRow = this._terminal._core.selectionManager.selectionEnd[1];\n    }\n\n    // Search from ydisp + 1 to end\n    for (let y = startRow + 1; y < this._terminal._core.buffer.ybase + this._terminal.rows; y++) {\n      result = this._findInLine(term, y, searchOptions);\n      if (result) {\n        break;\n      }\n    }\n\n    // Search from the top to the current ydisp\n    if (!result) {\n      for (let y = 0; y < startRow; y++) {\n        result = this._findInLine(term, y, searchOptions);\n        if (result) {\n          break;\n        }\n      }\n    }\n\n    // Set selection and scroll if a result was found\n 
    return this._selectResult(result);\n  }\n\n  /**\n   * Find the previous instance of the term, then scroll to and select it. If it\n   * doesn't exist, do nothing.\n   * @param term Tne search term.\n   * @param searchOptions Search options.\n   * @return Whether a result was found.\n   */\n  public findPrevious(term: string, searchOptions?: ISearchOptions): boolean {\n    if (!term || term.length === 0) {\n      return false;\n    }\n\n    let result: ISearchResult;\n\n    let startRow = this._terminal._core.buffer.ydisp;\n    if (this._terminal._core.selectionManager.selectionStart) {\n      // Start from the selection end if there is a selection\n      startRow = this._terminal._core.selectionManager.selectionStart[1];\n    }\n\n    // Search from ydisp + 1 to end\n    for (let y = startRow - 1; y >= 0; y--) {\n      result = this._findInLine(term, y, searchOptions);\n      if (result) {\n        break;\n      }\n    }\n\n    // Search from the top to the current ydisp\n    if
  (!result) {\n      for (let y = this._terminal._core.buffer.ybase + this._terminal.rows - 1; y > startRow; y--) {\n        result = this._findInLine(term, y, searchOptions);\n        if (result) {\n          break;\n        }\n      }\n    }\n\n    // Set selection and scroll if a result was found\n    return this._selectResult(result);\n  }\n\n  /**\n   * A found substring is a whole word if it doesn't have an alphanumeric character directly adjacent to it.\n   * @param searchIndex starting indext of the potential whole word substring\n   * @param line entire string in which the potential whole word was found\n   * @param term the substring that starts at searchIndex\n   */\n  private _isWholeWord(searchIndex: number, line: string, term: string): boolean {\n    return (((searchIndex === 0) || (nonWordCharacters.indexOf(line[searchIndex - 1]) !== -1)) &&\n         (((searchIndex + term.length) === line.length) || (nonWordCharacters.indexOf(line[searchIndex + term.length]) !== -1)))
 ;\n  }\n\n  /**\n   * Searches a line for a search term. Takes the provided terminal line and searches the text line, which may contain\n   * subsequent terminal lines if the text is wrapped. If the provided line number is part of a wrapped text line that\n   * started on an earlier line then it is skipped since it will be properly searched when the terminal line that the\n   * text starts on is searched.\n   * @param term Tne search term.\n   * @param y The line to search.\n   * @param searchOptions Search options.\n   * @return The search result if it was found.\n   */\n  protected _findInLine(term: string, y: number, searchOptions: ISearchOptions = {}): ISearchResult {\n    if (this._terminal._core.buffer.lines.get(y).isWrapped) {\n      return;\n    }\n\n    const stringLine = this.translateBufferLineToStringWithWrap(y, true);\n    const searchStringLine = searchOptions.caseSensitive ? stringLine : stringLine.toLowerCase();\n    const searchTerm = searchOptions.caseSensitive ? t
 erm : term.toLowerCase();\n    let searchIndex = -1;\n\n    if (searchOptions.regex) {\n      const searchRegex = RegExp(searchTerm, 'g');\n      const foundTerm = searchRegex.exec(searchStringLine);\n      if (foundTerm && foundTerm[0].length > 0) {\n        searchIndex = searchRegex.lastIndex - foundTerm[0].length;\n        term = foundTerm[0];\n      }\n    } else {\n      searchIndex = searchStringLine.indexOf(searchTerm);\n    }\n\n    if (searchIndex >= 0) {\n      // Adjust the row number and search index if needed since a \"line\" of text can span multiple rows\n      if (searchIndex >= this._terminal.cols) {\n        y += Math.floor(searchIndex / this._terminal.cols);\n        searchIndex = searchIndex % this._terminal.cols;\n      }\n      if (searchOptions.wholeWord && !this._isWholeWord(searchIndex, searchStringLine, term)) {\n        return;\n      }\n\n      const line = this._terminal._core.buffer.lines.get(y);\n\n      for (let i = 0; i < searchIndex; i++) {\n       
  const charData = line.get(i);\n        // Adjust the searchIndex to normalize emoji into single chars\n        const char = charData[1/*CHAR_DATA_CHAR_INDEX*/];\n        if (char.length > 1) {\n          searchIndex -= char.length - 1;\n        }\n        // Adjust the searchIndex for empty characters following wide unicode\n        // chars (eg. CJK)\n        const charWidth = charData[2/*CHAR_DATA_WIDTH_INDEX*/];\n        if (charWidth === 0) {\n          searchIndex++;\n        }\n      }\n      return {\n        term,\n        col: searchIndex,\n        row: y\n      };\n    }\n  }\n\n  /**\n   * Translates a buffer line to a string, including subsequent lines if they are wraps.\n   * Wide characters will count as two columns in the resulting string. This\n   * function is useful for getting the actual text underneath the raw selection\n   * position.\n   * @param line The line being translated.\n   * @param trimRight Whether to trim whitespace to the right.\n   */\n  public tr
 anslateBufferLineToStringWithWrap(lineIndex: number, trimRight: boolean): string {\n    let lineString = '';\n    let lineWrapsToNext: boolean;\n\n    do {\n      const nextLine = this._terminal._core.buffer.lines.get(lineIndex + 1);\n      lineWrapsToNext = nextLine ? nextLine.isWrapped : false;\n      lineString += this._terminal._core.buffer.translateBufferLineToString(lineIndex, !lineWrapsToNext && trimRight);\n      lineIndex++;\n    } while (lineWrapsToNext);\n\n    return lineString;\n  }\n\n  /**\n   * Selects and scrolls to a result.\n   * @param result The result to select.\n   * @return Whethera result was selected.\n   */\n  private _selectResult(result: ISearchResult): boolean {\n    if (!result) {\n      return false;\n    }\n    this._terminal._core.selectionManager.setSelection(result.col, result.row, result.term.length);\n    this._terminal.scrollLines(result.row - this._terminal._core.buffer.ydisp);\n    return true;\n  }\n}\n",null],"names":[],"mappings":"AEAA;;;A
 DMA;AAKA;AACA;AAAA;AAIA;AASA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AASA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AAQA;AACA;AACA;AACA;AAYA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AA1Ma;;;;;ADNb;AAWA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AANA;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AANA;AAQA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AARA;"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js
new file mode 100644
index 0000000..315629d
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js
@@ -0,0 +1,69 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.terminado = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function terminadoAttach(term, socket, bidirectional, buffered) {
+    var addonTerminal = term;
+    bidirectional = (typeof bidirectional === 'undefined') ? true : bidirectional;
+    addonTerminal.__socket = socket;
+    addonTerminal.__flushBuffer = function () {
+        addonTerminal.write(addonTerminal.__attachSocketBuffer);
+        addonTerminal.__attachSocketBuffer = null;
+    };
+    addonTerminal.__pushToBuffer = function (data) {
+        if (addonTerminal.__attachSocketBuffer) {
+            addonTerminal.__attachSocketBuffer += data;
+        }
+        else {
+            addonTerminal.__attachSocketBuffer = data;
+            setTimeout(addonTerminal.__flushBuffer, 10);
+        }
+    };
+    addonTerminal.__getMessage = function (ev) {
+        var data = JSON.parse(ev.data);
+        if (data[0] === 'stdout') {
+            if (buffered) {
+                addonTerminal.__pushToBuffer(data[1]);
+            }
+            else {
+                addonTerminal.write(data[1]);
+            }
+        }
+    };
+    addonTerminal.__sendData = function (data) {
+        socket.send(JSON.stringify(['stdin', data]));
+    };
+    addonTerminal.__setSize = function (size) {
+        socket.send(JSON.stringify(['set_size', size.rows, size.cols]));
+    };
+    socket.addEventListener('message', addonTerminal.__getMessage);
+    if (bidirectional) {
+        addonTerminal.on('data', addonTerminal.__sendData);
+    }
+    addonTerminal.on('resize', addonTerminal.__setSize);
+    socket.addEventListener('close', function () { return terminadoDetach(addonTerminal, socket); });
+    socket.addEventListener('error', function () { return terminadoDetach(addonTerminal, socket); });
+}
+exports.terminadoAttach = terminadoAttach;
+function terminadoDetach(term, socket) {
+    var addonTerminal = term;
+    addonTerminal.off('data', addonTerminal.__sendData);
+    socket = (typeof socket === 'undefined') ? addonTerminal.__socket : socket;
+    if (socket) {
+        socket.removeEventListener('message', addonTerminal.__getMessage);
+    }
+    delete addonTerminal.__socket;
+}
+exports.terminadoDetach = terminadoDetach;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.terminadoAttach = function (socket, bidirectional, buffered) {
+        return terminadoAttach(this, socket, bidirectional, buffered);
+    };
+    terminalConstructor.prototype.terminadoDetach = function (socket) {
+        return terminadoDetach(this, socket);
+    };
+}
+exports.apply = apply;
+
+},{}]},{},[1])(1)
+});
+//# sourceMappingURL=terminado.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js.map
new file mode 100644
index 0000000..2cbf183
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/terminado/terminado.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"terminado.js","sources":["../../../src/addons/terminado/terminado.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This module provides methods for attaching a terminal to a terminado\n * WebSocket stream.\n */\n\nimport { Terminal } from 'xterm';\nimport { ITerminadoAddonTerminal } from './Interfaces';\n\n/**\n * Attaches the given terminal to the given socket.\n *\n * @param term The terminal to be attached to the given socket.\n * @param socket The socket to attach the current terminal.\n * @param bidirectional Whether the terminal should send data to the socket as well.\n * @param buffered Whether the rendering of incoming data should happen instantly or at a maximum\n * frequency of 1 rendering per 10ms.\n */\nexport function terminadoAttach(term: Terminal, socket: WebSocket, bidirectional: boolean, buffered: boolean): void {\n  const addon
 Terminal = <ITerminadoAddonTerminal>term;\n  bidirectional = (typeof bidirectional === 'undefined') ? true : bidirectional;\n  addonTerminal.__socket = socket;\n\n  addonTerminal.__flushBuffer = () => {\n    addonTerminal.write(addonTerminal.__attachSocketBuffer);\n    addonTerminal.__attachSocketBuffer = null;\n  };\n\n  addonTerminal.__pushToBuffer = (data: string) => {\n    if (addonTerminal.__attachSocketBuffer) {\n      addonTerminal.__attachSocketBuffer += data;\n    } else {\n      addonTerminal.__attachSocketBuffer = data;\n      setTimeout(addonTerminal.__flushBuffer, 10);\n    }\n  };\n\n  addonTerminal.__getMessage = (ev: MessageEvent) => {\n    const data = JSON.parse(ev.data);\n    if (data[0] === 'stdout') {\n      if (buffered) {\n        addonTerminal.__pushToBuffer(data[1]);\n      } else {\n        addonTerminal.write(data[1]);\n      }\n    }\n  };\n\n  addonTerminal.__sendData = (data: string) => {\n    socket.send(JSON.stringify(['stdin', data]));\n  };\n\n  add
 onTerminal.__setSize = (size: {rows: number, cols: number}) => {\n    socket.send(JSON.stringify(['set_size', size.rows, size.cols]));\n  };\n\n  socket.addEventListener('message', addonTerminal.__getMessage);\n\n  if (bidirectional) {\n    addonTerminal.on('data', addonTerminal.__sendData);\n  }\n  addonTerminal.on('resize', addonTerminal.__setSize);\n\n  socket.addEventListener('close', () => terminadoDetach(addonTerminal, socket));\n  socket.addEventListener('error', () => terminadoDetach(addonTerminal, socket));\n}\n\n/**\n * Detaches the given terminal from the given socket\n *\n * @param term The terminal to be detached from the given socket.\n * @param socket The socket from which to detach the current terminal.\n */\nexport function terminadoDetach(term: Terminal, socket: WebSocket): void {\n  const addonTerminal = <ITerminadoAddonTerminal>term;\n  addonTerminal.off('data', addonTerminal.__sendData);\n\n  socket = (typeof socket === 'undefined') ? addonTerminal.__socket : so
 cket;\n\n  if (socket) {\n    socket.removeEventListener('message', addonTerminal.__getMessage);\n  }\n\n  delete addonTerminal.__socket;\n}\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  /**\n   * Attaches the current terminal to the given socket\n   *\n   * @param socket - The socket to attach the current terminal.\n   * @param bidirectional - Whether the terminal should send data to the socket as well.\n   * @param buffered - Whether the rendering of incoming data should happen instantly or at a\n   * maximum frequency of 1 rendering per 10ms.\n   */\n  (<any>terminalConstructor.prototype).terminadoAttach = function (socket: WebSocket, bidirectional: boolean, buffered: boolean): void {\n    return terminadoAttach(this, socket, bidirectional, buffered);\n  };\n\n  /**\n   * Detaches the current terminal from the given socket.\n   *\n   * @param socket The socket from which to detach the current terminal.\n   */\n  (<any>terminalConstructor.prototype).ter
 minadoDetach = function (socket: WebSocket): void {\n    return terminadoDetach(this, socket);\n  };\n}\n",null],"names":[],"mappings":"ACAA;;;ADoBA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AA/CA;AAuDA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAXA;AAaA;AASA;AACA;AACA;AAOA;AACA;AACA;AACA;AArBA;"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js
new file mode 100644
index 0000000..4220884
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js
@@ -0,0 +1,41 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.webLinks = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var protocolClause = '(https?:\\/\\/)';
+var domainCharacterSet = '[\\da-z\\.-]+';
+var negatedDomainCharacterSet = '[^\\da-z\\.-]+';
+var domainBodyClause = '(' + domainCharacterSet + ')';
+var tldClause = '([a-z\\.]{2,6})';
+var ipClause = '((\\d{1,3}\\.){3}\\d{1,3})';
+var localHostClause = '(localhost)';
+var portClause = '(:\\d{1,5})';
+var hostClause = '((' + domainBodyClause + '\\.' + tldClause + ')|' + ipClause + '|' + localHostClause + ')' + portClause + '?';
+var pathClause = '(\\/[\\/\\w\\.\\-%~]*)*';
+var queryStringHashFragmentCharacterSet = '[0-9\\w\\[\\]\\(\\)\\/\\?\\!#@$%&\'*+,:;~\\=\\.\\-]*';
+var queryStringClause = '(\\?' + queryStringHashFragmentCharacterSet + ')?';
+var hashFragmentClause = '(#' + queryStringHashFragmentCharacterSet + ')?';
+var negatedPathCharacterSet = '[^\\/\\w\\.\\-%]+';
+var bodyClause = hostClause + pathClause + queryStringClause + hashFragmentClause;
+var start = '(?:^|' + negatedDomainCharacterSet + ')(';
+var end = ')($|' + negatedPathCharacterSet + ')';
+var strictUrlRegex = new RegExp(start + protocolClause + bodyClause + end);
+function handleLink(event, uri) {
+    window.open(uri, '_blank');
+}
+function webLinksInit(term, handler, options) {
+    if (handler === void 0) { handler = handleLink; }
+    if (options === void 0) { options = {}; }
+    options.matchIndex = 1;
+    term.registerLinkMatcher(strictUrlRegex, handler, options);
+}
+exports.webLinksInit = webLinksInit;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.webLinksInit = function (handler, options) {
+        webLinksInit(this, handler, options);
+    };
+}
+exports.apply = apply;
+
+},{}]},{},[1])(1)
+});
+//# sourceMappingURL=webLinks.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js.map
new file mode 100644
index 0000000..fd39bfb
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/webLinks/webLinks.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webLinks.js","sources":["../../../src/addons/webLinks/webLinks.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal, ILinkMatcherOptions } from 'xterm';\n\nconst protocolClause = '(https?:\\\\/\\\\/)';\nconst domainCharacterSet = '[\\\\da-z\\\\.-]+';\nconst negatedDomainCharacterSet = '[^\\\\da-z\\\\.-]+';\nconst domainBodyClause = '(' + domainCharacterSet + ')';\nconst tldClause = '([a-z\\\\.]{2,6})';\nconst ipClause = '((\\\\d{1,3}\\\\.){3}\\\\d{1,3})';\nconst localHostClause = '(localhost)';\nconst portClause = '(:\\\\d{1,5})';\nconst hostClause = '((' + domainBodyClause + '\\\\.' + tldClause + ')|' + ipClause + '|' + localHostClause + ')' + portClause + '?';\nconst pathClause = '(\\\\/[\\\\/\\\\w\\\\.\\\\-%~]*)*';\nconst queryStringHashFragmentCharacterSet = '[0-9\\\\w\\\\[\\\\]\\\\(\\\\)\\\\/\\\\?\\\\!#@$%&\\'*+,:;~\\\\=\\\\.\
 \\\-]*';\nconst queryStringClause = '(\\\\?' + queryStringHashFragmentCharacterSet + ')?';\nconst hashFragmentClause = '(#' + queryStringHashFragmentCharacterSet + ')?';\nconst negatedPathCharacterSet = '[^\\\\/\\\\w\\\\.\\\\-%]+';\nconst bodyClause = hostClause + pathClause + queryStringClause + hashFragmentClause;\nconst start = '(?:^|' + negatedDomainCharacterSet + ')(';\nconst end = ')($|' + negatedPathCharacterSet + ')';\nconst strictUrlRegex = new RegExp(start + protocolClause + bodyClause + end);\n\nfunction handleLink(event: MouseEvent, uri: string): void {\n  window.open(uri, '_blank');\n}\n\n/**\n * Initialize the web links addon, registering the link matcher.\n * @param term The terminal to use web links within.\n * @param handler A custom handler to use.\n * @param options Custom options to use, matchIndex will always be ignored.\n */\nexport function webLinksInit(term: Terminal, handler: (event: MouseEvent, uri: string) => void = handleLink, options: ILinkMatcherOptions
  = {}): void {\n  options.matchIndex = 1;\n  term.registerLinkMatcher(strictUrlRegex, handler, options);\n}\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  (<any>terminalConstructor.prototype).webLinksInit = function (handler?: (event: MouseEvent, uri: string) => void, options?: ILinkMatcherOptions): void {\n    webLinksInit(this, handler, options);\n  };\n}\n",null],"names":[],"mappings":"ACAA;;;ADOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAQA;AAAA;AAAA;AACA;AACA;AACA;AAHA;AAKA;AACA;AACA;AACA;AACA;AAJA;"}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js
new file mode 100644
index 0000000..24f6c40
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js
@@ -0,0 +1,31 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.winptyCompat = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var CHAR_DATA_CODE_INDEX = 3;
+var NULL_CELL_CODE = 32;
+function winptyCompatInit(terminal) {
+    var addonTerminal = terminal;
+    var isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].indexOf(navigator.platform) >= 0;
+    if (!isWindows) {
+        return;
+    }
+    addonTerminal.on('linefeed', function () {
+        var line = addonTerminal._core.buffer.lines.get(addonTerminal._core.buffer.ybase + addonTerminal._core.buffer.y - 1);
+        var lastChar = line.get(addonTerminal.cols - 1);
+        if (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE) {
+            var nextLine = addonTerminal._core.buffer.lines.get(addonTerminal._core.buffer.ybase + addonTerminal._core.buffer.y);
+            nextLine.isWrapped = true;
+        }
+    });
+}
+exports.winptyCompatInit = winptyCompatInit;
+function apply(terminalConstructor) {
+    terminalConstructor.prototype.winptyCompatInit = function () {
+        winptyCompatInit(this);
+    };
+}
+exports.apply = apply;
+
+},{}]},{},[1])(1)
+});
+//# sourceMappingURL=winptyCompat.js.map

http://git-wip-us.apache.org/repos/asf/hadoop/blob/154449fb/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js.map
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js.map b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js.map
new file mode 100644
index 0000000..7e3ccc7
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/resources/TERMINAL/xterm/dist/addons/winptyCompat/winptyCompat.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"winptyCompat.js","sources":["../../../src/addons/winptyCompat/winptyCompat.ts","../../../node_modules/browser-pack/_prelude.js"],"sourcesContent":["/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal } from 'xterm';\nimport { IWinptyCompatAddonTerminal } from './Interfaces';\n\nconst CHAR_DATA_CODE_INDEX = 3;\nconst NULL_CELL_CODE = 32;\n\nexport function winptyCompatInit(terminal: Terminal): void {\n  const addonTerminal = <IWinptyCompatAddonTerminal>terminal;\n\n  // Don't do anything when the platform is not Windows\n  const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].indexOf(navigator.platform) >= 0;\n  if (!isWindows) {\n    return;\n  }\n\n  // Winpty does not support wraparound mode which means that lines will never\n  // be marked as wrapped. This causes issues for things like copying a line\n  // retaining the wrapped new line characters or if consumers are listening\n  // in on the dat
 a stream.\n  //\n  // The workaround for this is to listen to every incoming line feed and mark\n  // the line as wrapped if the last character in the previous line is not a\n  // space. This is certainly not without its problems, but generally on\n  // Windows when text reaches the end of the terminal it's likely going to be\n  // wrapped.\n  addonTerminal.on('linefeed', () => {\n    const line = addonTerminal._core.buffer.lines.get(addonTerminal._core.buffer.ybase + addonTerminal._core.buffer.y - 1);\n    const lastChar = line.get(addonTerminal.cols - 1);\n\n    if (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE) {\n      const nextLine = addonTerminal._core.buffer.lines.get(addonTerminal._core.buffer.ybase + addonTerminal._core.buffer.y);\n      nextLine.isWrapped = true;\n    }\n  });\n}\n\nexport function apply(terminalConstructor: typeof Terminal): void {\n  (<any>terminalConstructor.prototype).winptyCompatInit = function (): void {\n    winptyCompatInit(this);\n  };\n}\n",
 null],"names":[],"mappings":"ACAA;;;ADQA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AAYA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AA5BA;AA8BA;AACA;AACA;AACA;AACA;AAJA;"}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org