Vysor 1.7.6 chrome 插件破解

来源:互联网 发布:ios越狱内购改数据 编辑:程序博客网 时间:2024/06/11 19:24

在你的Chrome扩展文件里面,找到 名为uglify.js的文件。
我的文件地址:

C:\Users\jin\AppData\Local\Google\Chrome\User Data\Default\Extensions\gidgenkbbabolejbgbpnhbimgjbffefm\1.7.7_0

实在不行,你手动搜索一下,然后打开之后把文件格式化一下,这个自行百度。然后找到下面这个图的地方。你可以用 Vysor subscription is 这个关键词去搜索,找到这个地方,然后去掉

var e = !1, t = !1 (原文)
改后:
var e = 1, t = 1 (改后)

这里写图片描述

改完,保存重启。谢谢。

下面的代码下载地址:
完整代码:这里展示:

/** * Created by jin on 2017/6/27. */!function (e, t) {  function n(e) {    setTimeout(e, 0)  }  function o(e) {    for (var t = e.toString(16); t.length < 4;)t = "0" + t;    return t  }  function i(e) {    return unescape(encodeURIComponent(e))  }  function r(e) {    return decodeURIComponent(escape(e))  }  function s(e) {    return "ArrayBuffer" == e.constructor.name && (e = new Uint8Array(e)), r(String.fromCharCode.apply(null, e))  }  function c(e, t, n) {    e = i(e);    var o = e.length;    n && o++, t || (t = new ArrayBuffer(o));    var r = new Uint8Array(t);    n && (r[e.length] = 0);    for (var s = 0, c = e.length; s < c; s++)r[s] = e.charCodeAt(s);    return t  }  function a(e, t, n) {    "Object" == t.constructor.name && (t = JSON.stringify(t)), u(e, t + "\n", n)  }  function d(e, t) {    function n() {      e.read(function (i) {        for (var r = 0; r < i.byteLength; r++)if (i[r] == we) {          var c = i.subarray(0, r);          o.push(c);          var a = "";          for (var d in o)d = o[d], a += s(d);          var l = i.subarray(r + 1);          return e.unshift(l), void t(a)        }        o.push(i), n()      })    }    var o = [];    n()  }  function l(e, t) {    function n(t) {      o += s(t), e.read(n)    }    var o = "";    e.onClose = function () {      t(o)    }, e.read(n)  }  function u(e, t, n) {    "Object" == t.constructor.name && (t = JSON.stringify(t)), e.write(c(t), n)  }  function h(e, t) {    var n = new Uint8Array(e.byteLength + t.byteLength);    return n.set(e, 0), n.set(t, e.byteLength), n  }  function f(e) {    for (var t = window.atob(e), n = t.length, o = new Uint8Array(n), i = 0; i < n; i++) {      var r = t.charCodeAt(i);      o[i] = r    }    return o.buffer  }  function p(e) {    var t, n, o = "";    for (t = 0; t + 3 <= e.length; t += 3)n = parseInt(e.substring(t, t + 3), 16), o += be.charAt(n >> 6) + be.charAt(63 & n);    for (t + 1 == e.length ? (n = parseInt(e.substring(t, t + 1), 16), o += be.charAt(n << 2)) : t + 2 == e.length && (n = parseInt(e.substring(t, t + 2), 16), o += be.charAt(n >> 2) + be.charAt((3 & n) << 4)); (3 & o.length) > 0;)o += ke;    return o  }  function v(e, t) {    t || (t = window.location);    for (var n = t.search.substring(1), o = n.split("&"), i = 0; i < o.length; i++) {      var r = o[i].split("=");      if (decodeURIComponent(r[0]) == e)return decodeURIComponent(r[1])    }  }  function g(e, t, n, o) {    return e || (e = {items: []}), e.items.push(t), e.timeout || (e.timeout = setTimeout(function () {      delete e.timeout, o(e.items), e.items = []    }, n)), e  }  function m(e, t) {    if (console.log("notification:", e), window.chrome && window.chrome.notifications) {      var n = chrome.runtime.getManifest(), o = n.name;      t = t || n.icons[128], chrome.notifications.create({type: "basic", iconUrl: t, title: o, message: e})    }  }  function y() {  }  function w(e, t) {    return window.chrome && window.chrome.identity ? void chrome.identity.getAuthToken({      interactive: e,      scopes: ["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/chromewebstore.readonly"]    }, function (e) {      e || console.error("unable to get authToken", chrome.runtime.lastError), t(e)    }) : (console.error("no auth token implemented"), void process.nextTick(t))  }  function b(e) {    e && (this.dataReceived(e), this.dataReceived(null))  }  function k(e, t) {    this.promise = fetch(e).then(function (e) {      this.connected = !0, this.response = e, this.reader = this.response.body.getReader(), this.reader.closed.then(function () {        this.onClose && this.dataReceived(null)      }.bind(this)), this.onResume(), t(this)    }.bind(this), function (e) {      t(null, e)    })  }  function C(e, t, n, o, i) {    o = f(o), n = c(n), window.crypto.subtle.importKey("jwk", {      kty: "RSA",      e: e,      n: t,      alg: "RS1"    }, {name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"}}, !0, ["verify"]).then(function (e) {      window.crypto.subtle.verify({name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"}}, e, o, n).then(function (e) {        return e ? void i() : void i("invalid signature")      }).catch(function (e) {        i("failure to verify", e)      })    }).catch(function (e) {      i("key import failed", e)    })  }  function S() {  }  function A(e, t, n) {    this.adbSocketFactory = e, this.conn = n, this.conn.openSocket = this.openSocket.bind(this);    var o = t.properties.substring(t.properties.indexOf("product")).replace(/ /g, ";").replace("device", "ro.product.device").replace("model", "ro.product.model").replace("product", "ro.product.name").replace(/:/g, "=");    this.properties = "device::" + o + ";"  }  function D(e) {    chrome.storage.local.get("whitelist", function (t) {      var n = {};      return t.whitelist && "Array" == t.whitelist.constructor.name ? ($.each(t.whitelist, function (e, t) {        n[t] = !0      }), void e(n)) : void e(n)    })  }  function I(e, t) {    chrome.storage.local.set({whitelist: Object.keys(e)}, t)  }  function L(e, t) {    D(function (n) {      n[e] = !0, I(n, t)    })  }  function O(e, t) {    chrome.storage.local.get(["whitelist", "serverMode"], function (n) {      if (1 == n.serverMode)return void t(!0);      if (2 != n.serverMode) {        return n.whitelist && "Array" == n.whitelist.constructor.name ? void t(n.whitelist.indexOf(e) != -1, !0) : void t(!1, !0)      }      w(!1, function (n) {        return n ? void $.ajax({          type: "get",          url: "https://billing.vysor.io/whitelist",          headers: {Authorization: "Bearer " + n},          data: {email: e},          error: function () {            console.error("failure checking vysor enterprise whitelist", arguments), t(!1)          },          success: function (n) {            n.whitelist || console.error("access denied to", e, n), t(n.whitelist, !1)          }        }) : (console.error("unable to get token for vysor enterprise whitelist check"), void t(!1))      })    })  }  function R(e) {    return e ? (e.friendlyName && !e.friendlyName.length && delete e.friendlyName, e) : null  }  function E(e) {    window.chrome && window.chrome.storage ? chrome.storage.local.get("device-settings", function (t) {      e(t["device-settings"] || {})    }) : e({})  }  function U(e) {    e.contentWindow._lm = {      _il: We.a(),      _ilc: We.c(),      _cl: We.b.bind(We),      refresh: We.refresh.bind(We),      startPurchase: We.startPurchase.bind(We)    }, e.contentWindow._rl && e.contentWindow._rl()  }  function T(e, t) {    if (De) {      var n = De.contentWindow.shortModal;      n && n(e, t)    }  }  function W() {    T(null, Pe)  }  function P() {    De && De.contentWindow.updateVysorShareServer && De.contentWindow.updateVysorShareServer(Ae)  }  function M(e, t) {    var n = j(e);    console.log(e, n, "status", t);    var o = chrome.app.window.get(n);    o && o.contentWindow.updateWindowStatusText && o.contentWindow.updateWindowStatusText(t)  }  function N(e, t) {    M(e, "Installing Vysor APK..."), AdbUtils.installApk("/Vysor-release.apk", e, t)  }  function _(e, t, n) {    function o(o) {      var i = Math.round(Math.random() * (1 << 30)).toString(16),        r = "echo -n " + i + " > /data/local/tmp/vysor.pwd ; chmod 600 /data/local/tmp/vysor.pwd";      AdbUtils.runMain(e, o, "com.koushikdutta.vysor.Main password=" + i + " keyboard=" + Se, function (o) {        Adb.shell({serialno: e, command: 'sh -c "' + r + '"'}, function (e) {          Socket.eat(o), n(t, i)        })      }, function (e, t) {        e.command = "shell:" + e.command, Adb.sendClientCommand(e, t)      })    }    function i(t) {      M(e, "Connecting..."), AdbUtils.getApkPath(e, "com.koushikdutta.vysor", function (n) {        return n ? void AdbUtils.runMain(e, n, "com.koushikdutta.vysor.ProtocolVersionMain", function (e) {          var o = e.match(/vysor-io-.*?[\r\n]/);          return o && o.length ? (e = o[0], e && (e = e.trim()), console.log("protocol version: " + e), void t("vysor-io-45" != e ? null : n)) : void t(null)        }) : void t()      })    }    M(e, "Connecting..."), i(function (t) {      return t ? void o(t) : (console.log("installing apk"), void N(e, function (t) {        i(function (n) {          return n ? void o(n) : (t || (t = ""), m("Error installing APK:\n" + t.trim()), void x(e))        })      }))    })  }  function x(e) {    var t = j(e), n = chrome.app.window.get(t);    n && n.close()  }  function F(e, t) {    return void _(e, null, t)  }  function B(e, t, n, o) {    isElectron() ? (console.log("adb client socket factory path"), e.contentWindow.adbSocketFactory = null, e.contentWindow.adbSocketFactoryFactory = {      type: "adb-client",      arguments: {serialno: t}    }) : Le[t] ? (console.log("vysor socket fast path"), e.contentWindow.adbSocketFactory = Le[t]) : Ie.isRunning() ? (console.log("adb server socket path"), e.contentWindow.adbSocketFactory = Ie.adbDevices[t]) : (console.log("adb client socket path"), e.contentWindow.adbSocketFactory = Adb.createSocketFactory(t)), U(e), e.contentWindow.openList = G, e.contentWindow.password = o, e.contentWindow.port = n, Me && Me.socket && (e.contentWindow.httpPort = Me.socket.localPort), e.contentWindow.device = Le[t] || $e[t], e.contentWindow.tracker = Ue  }  function V() {    setTimeout(function () {      chrome.app.window.getAll().length || chrome.runtime.reload()    }, 5e3)  }  function j(e) {    var t = e;    return Le[e] && Le[e].id ? t = Le[e].id : $e[e] && $e[e].id ? t = $e[e].id : Ye[e] && (t = Ye[e]), t  }  function K(e, t, n) {    ee();    var o = j(e), i = chrome.app.window.get(o);    return i ? (i.show(), t && F(e, function (t, n) {      B(i, e, t, n), i.contentWindow.connectionReady()    }), void(n && n(i))) : void chrome.app.window.create("screen.html", {      id: o,      innerBounds: {width: 576, height: 1024}    }, function (t) {      var o;      t.onClosed.addListener(o = function () {        t.onClosed.removeListener(o), V(), t.contentWindow.h264Socket && (console.log("cleaning up h264 socket"), t.contentWindow.h264Socket.destroy(), t.contentWindow.h264Socket = null), t.contentWindow.inputWebSocket && (console.log("cleaning up input websocket"), t.contentWindow.inputWebSocket.close(), t.contentWindow.inputWebSocket = null)      }), B(t, e, null, null), t.contentWindow.onload = function () {        return n && n(t), $e[e] ? void F(e, function (n, o) {          B(t, e, n, o), t.contentWindow.connectionReady()        }) : void console.log("Vysor requested for", e, "which is not available yet")      }    })  }  function q() {    Ae = null, _e && _e.stopListen("share"), P()  }  function H(e) {    var t = Re[e];    t && t.gcmConn.destroy()  }  function J(e, t, n) {    var o = Re[e];    if (o && o.devices[t]) {      o.gcmConn.gcmConns[t] && o.gcmConn.gcmConns[t].destroy();      var i, r = o.gcmConn.gcmConns[t] = {        id: t, farm: !0, newSocket: function (e, n) {          i || o.gcmConn.newSocket(t + ":" + e, n)        }, destroy: function () {          i = !0, o.gcmConn.gcmConns[t] == r && delete o.gcmConn.gcmConns[t], delete $e[r.serialno], o.gcmConn.newSocket("close:" + t, function (e) {            e && e.destroy()          });          var e = r.onClose;          e && (delete r.onClose, e()), ue()        }      };      Q(t, function (e) {        e(r)      }, n), ue()    }  }  function Y(e, t, n) {    function o(e) {      n && n(null, e)    }    function i(e) {      return _e ? void _e.connect({        senderId: "64148182473",        registrationId: e.registration,        port: "share"      }, function (i) {        function s() {          i.newSocket("devices:", function (e) {            l(e, function (e) {              var t = JSON.parse(e), n = t.devices, o = t.sharedDevices;              h.devices ? ($.each(Object.keys(n), function (e, t) {                delete h.devices[t]              }), $.each(Object.keys(h.devices), function (e, t) {                var n = i.gcmConns[t];                n && n.destroy()              }), h.devices = n) : h.devices = n, h.sharedDevices = o, ue()            })          })        }        Ue.sendEvent("connected-device-farm");        var c, u = Re[r];        u && u.gcmConn.destroy();        var h = Re[r] = {info: e, gcmConn: i};        i.gcmConns = {}, i.openSocket = function (e, r) {          function l() {            c.read(function () {              s(), l()            })          }          if (e.startsWith("challenge:")) {            console.log("received challenge", e);            var u = e.split(":")[1];            $.ajax({              type: "post",              url: "https://billing.vysor.io/verifyauth",              headers: {Authorization: "Bearer " + t},              data: {nonce: u},              dataType: "json",              success: function (e) {                Ne = JSON.parse(e.signed_data), console.log("sending challenge response", e), a(r, e, function () {                  d(r, function (e) {                    return r.destroy(), "ok" == e ? (s(), void(n && n(h.info))) : void o("Access denied: " + e)                  })                })              },              error: function (e, t) {                o("Unable to verify identity."), r.destroy()              }            })          } else if (e.startsWith("close:")) {            r.destroy();            var f = e.split(":")[1], p = i.gcmConns[f];            if (!p)return void console.log("can't close unknown subconn");            p.destroy()          } else e.startsWith("tracker:") ? (console.log("got tracker socket"), c = r, l()) : (console.log("got unknown socket request", e), r.destroy())        }, i.onClose = function () {          Re[r] == h && delete Re[r], $.each(Object.keys(i.gcmConns), function (e, t) {            var n = i.gcmConns[t];            n && n.destroy()          }), ue()        }, console.log("Connection to device farm established", i)      }) : void o(Pe)    }    e = new URL(e);    var r = e.hash.replace("#", "");    $.ajax({      url: "https://billing.vysor.io/gcm/" + r, dataType: "json", success: i, error: function (e, t) {        m("Unable to find server: " + t)      }    })  }  function X(e, t) {    function n(e) {      ue(), t ? t(null, e) : m(e)    }    function o() {      ue(), t && t(Ae)    }    q(), w(e, function (e) {      function t() {        console.log("registering vysor share server"), $.ajax({          type: "post",          url: "https://billing.vysor.io/gcm",          headers: {Authorization: "Bearer " + e},          data: {registration: _e.registrationId},          dataType: "json",          success: function (e) {            console.log("vysor share server", e), chrome.storage.local.set({              lastDeviceFarmRegistrationId: _e.registrationId,              lastDeviceFarmServerId: e.id            }), Ae = "https://vysor.clockworkmod.com/server#" + e.id, o(Ae)          }.bind(this),          error: function (e, t) {            q(), n("Unable to register server: " + t)          }        })      }      function i() {        r = g(r, null, 500, function () {          $.each(l, function (e, t) {            t.trackerSocket && t.trackerSocket.write(c("0000\n"), function () {            })          }), ue()        })      }      if (!e)return void n("Unable to get Auth Token.");      if (!_e)return void n(Pe);      _e.onRegistrationIdChanged = t, chrome.storage.local.get(["lastDeviceFarmRegistrationId", "lastDeviceFarmServerId"], function (e) {        return e && e.lastDeviceFarmRegistrationId == _e.registrationId && e.lastDeviceFarmServerId ? (console.log("device farm registration unchanged, not registering with server."), Ae = "https://vysor.clockworkmod.com/server#" + e.lastDeviceFarmServerId, void o(Ae)) : void t()      });      var r, s, l = [];      _e.listen("share", function (e) {        var t, n, o, r = {},          c = Math.round(Math.random() * (1 << 30)).toString(16) + Math.round(Math.random() * (1 << 30)).toString(16);        e.onClose = function () {          var t = l.indexOf(e);          t != -1 && l.splice(t, 1), e.trackerSocket && (e.trackerSocket.destroy(), delete e.trackerSocket), $.each(Object.keys(r), function (e, t) {            var n = r[t];            n.destroy()          })        }, e.newSocket("challenge:" + c, function (i) {          return i ? void d(i, function (r) {            function s(e) {              e = e || "fail", console.log("Remote user failed to authorize", e), a(i, e, function () {                i.destroy()              })            }            console.log("received challenge response", r);            var d = JSON.parse(r);            C("AQAB", "hDuGsIhbjLYXteQX3F3KNriQHwUSZurS5voCkdpA1733A65pqtGOrk9g_yLiF94_vSK0VmL-4stq7WAYEbn6nw", d.signed_data, d.signature, function (r) {              function u() {                function r() {                  l.push(e), t = !0, a(i, "ok", function () {                    i.destroy()                  }), m("Vysor is sharing Android devices with " + n.name, o), Adb.sendHostCommand("host:track-devices", function (t) {                    return t ? void e.newSocket("tracker:", function (n) {                      return n ? (e.trackerSocket = n, void Socket.stream(n, t)) : (t.destroy(), void console.error("unable to open remote tracker"))                    }) : void console.error("unable to track adb devices", chrome.runtime.lastError)                  })                }                O(n.email, function (e, t) {                  if (e)return void r();                  if (!t)return void s("Denied by policy.");                  var i = chrome.runtime.getManifest().name;                  chrome.notifications.create({                    type: "basic",                    iconUrl: o,                    title: i,                    message: n.name + " is requesting access to Vysor shared Android devices.",                    buttons: [{title: "Allow"}, {title: "Deny"}]                  }, function (e) {                    var t, o = function (n) {                      n == e && (chrome.notifications.onClosed.removeListener(o), chrome.notifications.onButtonClicked.removeListener(i), t || s("Denied by user."))                    }, i = function (o, i) {                      o == e && (chrome.notifications.clear(o), t = !0, 0 == i ? (L(n.email, function () {                        P()                      }), r()) : s("Denied by user."))                    };                    chrome.notifications.onClosed.addListener(o), chrome.notifications.onButtonClicked.addListener(i)                  })                })              }              return r ? void s("Identify signature verification failed.") : (n = JSON.parse(d.signed_data), n.nonce != c ? void s("Mismatched nonce in authentication.") : void(n.picture ? Ce(n.picture, function (e) {                o = e, u()              }) : (o = "/icon.png", u())))            })          }) : (console.error("challenge socket failed"), void e.destroy())        }), e.openSocket = function (o, c) {          if (!t)return void c.destroy();          if ("devices:" == o) s = g(s, c, 500, function (e) {            E(function (t) {              Adb.devices(function (n) {                n || (n = {}), $.each(Object.keys(n), function (e, o) {                  Le[o] && delete n[o], R(t[o]), t[o] && t[o].friendlyName && (n[o].name = t[o].friendlyName)                });                var o = {};                $.each(Object.keys(Oe), function (e, t) {                  o[t] = {userInfo: Oe[t].userInfo}                }), $(e).each(function (e, t) {                  u(t, {devices: n, sharedDevices: o}, function () {                    t.destroy()                  })                })              })            })          }); else if (o.startsWith("close:")) {            c.destroy();            var a = o.split(":")[1], d = r[a];            d && d.destroy()          } else {            var l = o.indexOf(":");            if (l == -1)return console.error("unexpected command received by device farm server"), void c.destroy();            var a = o.substring(0, l);            if (!$e[a]) {              if (l = o.indexOf(":", l + 1), l == -1)return void c.destroy();              if (a = o.substring(0, l), !$e[a])return void console.error("request for unknown device", a)            }            var d = r[a];            if (!d) {              var h = Adb.createSocketFactory(a);              d = r[a] = new A(h, $e[a], {}), d.destroy = function () {                try {                  e.newSocket("close:" + a, function (e) {                    e && e.destroy()                  })                } catch (e) {                }                var t = Oe[a];                t && (t.userInfo == n && delete t.userInfo, t.gcmConn == this && delete t.gcmConn, t.key || t.gcmConn || delete Oe[a]);                var o = this.onClose;                o && (delete this.onClose, o()), i()              }.bind(d)            }            var f = Oe[a];            f || (f = Oe[a] = {}), f.gcmConn != d && (te(a), f.gcmConn = d, f.userInfo = n, Oe[a] = f), i();            var p = o.substring(l + 1);            d.openSocket(p, c)          }        }      })    })  }  function z(e) {    Se = e  }  function G() {    return De ? void De.focus() : void chrome.app.window.create("list.html", {      id: "list",      innerBounds: {width: 768, height: 768, minWidth: 768, minHeight: 768}    }, function (e) {      De = e, De.contentWindow.openList = G, U(De), De.contentWindow.disconnectSharedDevice = ae, De.contentWindow.toggleShare = de, De.contentWindow.unshareDevice = ne, De.contentWindow.quietSerial = ce, De.contentWindow.openWindow = K, De.contentWindow.closeWindow = x, De.contentWindow.createDeviceFarmConnection = J, De.contentWindow.destroyDeviceFarmConnection = H, De.contentWindow.adbServer = Ie, De.contentWindow.tracker = Ue, De.contentWindow.startWireless = le, De.contentWindow.startDeviceFarm = X, De.contentWindow.stopDeviceFarm = q, De.contentWindow.updateKeyboard = z, De.contentWindow.onload = function () {        U(De), P(), ue()      }, De.onClosed.addListener(function () {        De = null, V()      })    })  }  function Q(e, t, n) {    Ie.start();    var o = new Server;    o.listen({port: 0, address: "127.0.0.1"}, function (e) {      o.destroy();      var i = new AdbDaemon(new AdbTcpTransport(e));      t(function (e) {        Ue.sendEvent("connected-shared-device");        var t = "127.0.0.1:" + o.localPort;        e.serialno = t, e.id || (e.id = t), Le[t] = e, console.log("connected gcm socket"), e.openSocket = function () {          console.log("got a new socket? this should not happen..."), e.destroy()        }, i.onClose = e.onClose = function () {          delete Le[t], i.destroy(), e.destroy()        }, e.onClose = function () {          delete Le[t], i.destroy(), e.destroy(), m("Disconnected from shared Android device.")        }, i.openSocket = function (t, n) {          e.newSocket(t, function (e) {            Socket.stream(n, e, function () {            })          })        }, e.newSocket("properties", function (o) {          l(o, function (o) {            var r = AdbDevice.parseConnectionPayload(o);            e.name = e.name || r["ro.product.model"].replace("_", " "), i.start(o), console.log("got properties", o), n(t)          })        })      })    }.bind(this), function (t) {      if (t)return void console.log("adb daemon failed to listen: " + t);      var n = "127.0.0.1:" + o.localPort;      Le[n] = {        id: e || n, destroy: function () {        }      }, console.log("mapping", n, e), ue(), Adb.sendHostCommand("host:connect:" + n, function (e, t) {        e && (e.destroy(), t = s(t), console.log("adb connect result", t))      })    }.bind(this))  }  function Z(e, t) {    if (m("Vysor is connecting to a remote Android device"), De && De.show(), console.log("attempting to connect to shared device", e), !_e)return void W();    var n = new URL(e), o = v("senderId", n), i = v("registrationId", n), r = v("channel", n);    o || (o = "64148182473"), Q(null, function (e) {      _e.connect({senderId: o, registrationId: i, port: r}, e)    }, t)  }  function ee() {    chrome.runtime.requestUpdateCheck(function (e, t) {      console.log("update check", arguments), "update_available" == e && ye()    })  }  function te(e) {    var t = Oe[e];    if (t && t.gcmConn) {      var n = t.gcmConn;      delete t.gcmConn, n.destroy()    }  }  function ne(e) {    te(e), delete Oe[e], ue()  }  function oe(e, t) {    function n(e) {      t && t(null, e)    }    var o = $e[e];    if (!_e)return void n(Pe);    var i = Math.round(Math.random() * (1 << 30)).toString(16);    Oe[e] || (Oe[e] = {}), Oe[e].key = i, ue();    var r = "https://vysor.clockworkmod.com/redirect/?registrationId=" + encodeURIComponent(_e.registrationId) + "&channel=" + i;    console.log(r), _e.listen(i, function (t) {      Ue.sendEvent("shared-device");      var n = Oe[e];      if (!n || n.key != i)return t.destroy(), void console.log("device is no longer being shared.");      n.gcmConn && n.gcmConn.destroy(), n.gcmConn = t, n.userInfo = {name: "Someone"}, ue(), console.log("accepted gcm socket");      var r = Adb.createSocketFactory(e), s = new A(r, o, t);      s.onOpenSocket = function (t, n) {        if ("webstart" == t)return _(e, null, function (e, t) {          a(n, t, function () {            console.log("sent password", t), n.destroy()          })        }), !0      }    });    var s = "https://tu3ph.app.goo.gl/?ad=0&apn=com.koushikdutta.inkwire&link=" + encodeURIComponent(r);    t(s)  }  function ie() {    return xe ? xe : (console.log("creating persistent gcm connection"), xe = new Promise(function (e, t) {      GcmRtcManager.start({        3505780036: "AIzaSyDt0GimPRhk8_d_4XjOYzQUn50UkvXhMtE",        64148182473: "AIzaSyDd7k1v017osyYbIC92fyf-36s3pv0z73U"      }, {        iceServers: [{          url: "turn:n0.clockworkmod.com",          username: "foo",          credential: "bar"        }, {url: "turn:n1.clockworkmod.com", username: "foo", credential: "bar"}]      }, function (t) {        return _e = t, console.log("persistent gcm connection created", null != t), _e ? (_e.defaultSenderId = "64148182473", void e(_e)) : (xe = null, void e())      })    }))  }  function re(e) {    return function () {      var t = arguments;      ie().then(function () {        e.apply(null, t)      })    }  }  function se(e) {    var t = ze[e];    clearTimeout(t), ze[e] = setTimeout(function () {      delete ze[e]    }, 1e4), delete Xe[e]  }  function ce(e) {    var t = Xe[e];    clearTimeout(t), Xe[e] = setTimeout(function () {      delete Xe[e]    }, 1e4), delete ze[e]  }  function ae(e) {    x(e);    var t = Le[e];    t && t.destroy()  }  function de(e, t) {    Oe[e] ? ne(e) : oe(e, t), ue()  }  function le(e) {    var t = Adb.createSocketFactory(e);    t.newSocket("shell:ifconfig wlan0", function (n) {      return n ? void l(n, function (n) {        function o(e, t) {          Adb.sendHostCommand("host:disconnect:" + a, function (n, o) {            n && n.destroy(), delete $e[a], Adb.sendHostCommand("host:connect:" + a, function (n, o) {              return n ? (n.destroy(), o = s(o), o.indexOf("unable to connect") != -1 ? (m("Unable to connect via wireless. Is your Android on the same network as your PC?"), void(t && t(o))) : (t && t(), chrome.storage.local.set({lastConnectAddress: a}), console.log("adb connect result", o), void(e && i()))) : (m("Unable to connect via wireless. Is your Android on the same network as your PC?"), void(t && t("host connect failed")))            })          })        }        function i() {          ue(), m("Vysor is connected wirelessly. You may disconnect your device."), Ue.sendEvent("go-wireless"), ce(a), K(a, !0, function (e) {            se(a), e.contentWindow.tryReconnect = function () {              se(a), o(!1)            }          })        }        console.log("ifconfig result", n);        var r = n.match("inet addr:(.*?) ");        if (r || (r = n.match("wlan0: ip (.*?) ")), !r)return void m("Unable to switch to wireless mode. Is your Android connected to Wifi?");        var c = r[1], a = c + ":5555";        Je[e] = a, Ye[a] = e;        var d = $e[a];        return d && (d.id = e), Ye[e] && (device.id = Ye[e]), d && "device" == d.status ? void i() : (ce(e), void t.newSocket("tcpip:5555", function (e) {          return e ? void l(e, function (e) {            console.log("tcpip:5555 result", e), o(!0, function (e) {              e && (console.error("host:connect failed, trying again in a few seconds", e), setTimeout(function () {                o(!0, function (e) {                  e && console.err("host:connect failed again, giving up.", e)                })              }, 3e3))            })          }) : void m("Failure while switching to wireless mode.")        }))      }) : void console.log("error running tcpip:5555")    })  }  function ue() {    Be || (Be = n(function () {      Be = null, De && De.contentWindow.refreshList && De.contentWindow.refreshList($e, Le, Ne, Re, Oe, Ye, Je, _e && _e.isListening("share"), Fe, Ie.isRunning(), je)    }))  }  function he() {    chrome.storage.local.get("connect-automatically", function (e) {      var t;      t = e["connect-automatically"] === !1 ? 2 : e["connect-automatically"] === !0 ? 0 : e["connect-automatically"] || 0, Adb.devices(function (e) {        if (e) {          var n;          $.each(e, function (o, i) {            function r() {              return "unauthorized" != s.status || (m("Vysor has detected an Android device. Please Allow USB Debugging on your Android device to continue."), !1)            }            n = !0;            var s = e[o];            Ye[o] && (s.id = Ye[o]);            var c = $e[o];            if (!c || s.status != c.status) {              ne(o);              var a = s.properties.indexOf("emulator") != -1 || s.properties.indexOf("vbox") != -1, d = j(o);              if (!a && Ve && !Xe[d]) {                if (chrome.app.window.get(d) || Ie.isRunning() || ze[d])return void(r() && K(o, !0));                if (2 != t && r() && "device" == s.status) {                  var l = chrome.runtime.getManifest().name;                  return 1 != t ? (chrome.notifications.create("never-start-automatically", {                    type: "basic",                    iconUrl: "/icon.png",                    title: l,                    message: "Vysor has connected to an Android device and is starting.",                    buttons: [{title: "Never Start Automatically"}]                  }), void K(o, !0)) : void chrome.notifications.create("never-start-automatically-" + Math.random(), {                    type: "basic",                    iconUrl: "/icon.png",                    title: l,                    message: "Vysor has detected an Android device.",                    buttons: [{title: "View Android with Vysor"}, {title: "Never Start Automatically"}]                  }, function (e) {                    var t = function (o) {                      o == e && (chrome.notifications.onClosed.removeListener(t), chrome.notifications.onButtonClicked.removeListener(n))                    }, n = function (t, n) {                      t == e && (chrome.notifications.clear(t), 0 == n ? K(o, !0) : chrome.storage.local.set({"connect-automatically": !1}))                    };                    chrome.notifications.onClosed.addListener(t), chrome.notifications.onButtonClicked.addListener(n)                  })                }              }            }          }), $e = e        } else $e = {};        ue(), Ve = !0      })    })  }  function fe() {    if (!Fe) {      if (isElectron()) {        var e = require("os").platform(), t = chrome.runtime.getAppDirectory(),          n = require("path").join(t, "native", e, "adb");        return "win32" == e ? n += ".exe" : require("fs").chmodSync(n, "755"), console.log("attempting to start built in adb binary", n), void require("child_process").execFile(n, ["start-server"])      }      je || window.chrome && window.chrome.runtime && window.chrome.runtime.connectNative && (je = chrome.runtime.connectNative("com.clockworkmod.adb"), je.onDisconnect.addListener(function () {        je = null      }), je.postMessage({command: "start-server"}))    }  }  function pe() {    Ke || fe(), Ke = g(Ke, null, 1e4, fe)  }  function ve() {    He = g(He, null, 300, function () {      he()    })  }  function ge() {    function e(t) {      t.read(function (n) {        ve(), e(t)      })    }    qe || (Adb.sendHostCommand("host:version", function (e, t) {      e && (e.destroy(), t = s(t), console.log("ADB Server Version: ", t))    }), Adb.sendHostCommand("host:track-devices", function (t) {      return qe ? void t.destroy() : void(t && (console.log("Connected to ADB Server"), Ie.isRunning() ? console.log("Using Vysor ADB") : console.log("Using Android SDK ADB"), Fe = !0, t.onClose = function () {        qe = null, Fe = !1, ve()      }, qe = t, e(t), ve()))    }))  }  function me() {    ge(), pe(), setTimeout(me, 1e3)  }  function ye() {    Ge = g(Ge, null, 1e4, function () {      var e = chrome.runtime.getManifest().name;      chrome.notifications.create("reload", {        type: "basic",        iconUrl: "/icon.png",        title: e,        message: "There is an update available for Vysor.",        buttons: [{title: "Reload"}]      })    })  }  var we = "\n".charCodeAt(0),    be = ((new Date).getTime(), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"), ke = "=";  String.prototype.startsWith || Object.defineProperty(String.prototype, "startsWith", {    enumerable: !1,    configurable: !1,    writable: !1,    value: function (e, t) {      return t = t || 0, this.lastIndexOf(e, t) === t    }  }), Object.fromArray = function (e) {    var t = {};    for (var n in e) {      var o = e[n];      t[o] = o    }    return t  }, $.ajaxTransport("+binary", function (e, t, n) {    if (window.FormData && (e.dataType && "binary" == e.dataType || e.data && (window.ArrayBuffer && e.data instanceof ArrayBuffer || window.Blob && e.data instanceof Blob)))return {      send: function (t, n) {        var o = new XMLHttpRequest, i = e.url, r = e.type, s = e.async || !0, c = e.responseType || "blob",          a = e.data || null, d = e.username || null, l = e.password || null;        o.addEventListener("load", function () {          var t = {};          t[e.dataType] = o.response, n(o.status, o.statusText, t, o.getAllResponseHeaders())        }), o.open(r, i, s, d, l);        for (var u in t)o.setRequestHeader(u, t[u]);        o.responseType = c, o.send(a)      }, abort: function () {        n.abort()      }    }  });  var Ce = function () {    var e = {};    return function (t, n) {      if (e[t])return void n(e[t]);      var o = new XMLHttpRequest;      o.open("GET", t, !0), o.responseType = "blob", o.onload = function (o) {        n(e[t] = window.URL.createObjectURL(this.response))      }, o.send()    }  }();  !function () {    function*e() {    }    var t = e();    t.constructor.prototype.async = function () {      function e() {        i = o.throw(new Error(arguments)), n()      }      function t() {        var e = arguments[0];        i = o.next(e), n()      }      function n(n) {        var r, s;        if (!i.done) {          if (!i.value)return void(i = o.next(t));          if (i.value.constructor == Promise)return void i.value.then(t).catch(e);          if (i.value == Error) r = !0, i = o.next(e); else {            if (i.value != y)throw new Error("Unexpected yield value for callback. Only Error and Success allowed.");            s = !0, i = o.next(t)          }          if (!i.value)throw new Error("Double yield callbacks must explicitly define both Error and Success");          if (i.value == Error && r)throw new Error("Error callback already defined");          if (i.value == y && s)throw new Error("Success callback already defined");          if (i.value != Error && i.value != y)throw new Error("Unexpected yield value for callback. Only Error and Success allowed.");          i = r ? o.next(t) : o.next(e)        }      }      var o = this, i = o.next();      i.done || n()    }  }(), window.isElectron = function () {    return navigator.userAgent.indexOf("Electron") != -1  }, isElectron() || (window.sharedGlobals = window), function () {    function e(e) {      try {        for (var t in e)e[t] && e[t].constructor != String && (e[t] = JSON.stringify(e[t]));        i += e.join(" ") + "\n"      } catch (e) {      }    }    function t(e) {      return new Promise(function (t, n) {        return e.getConsoleLog ? void e.getConsoleLog(function (e) {          t({content: e && e.length ? e : "log is empty"})        }) : void t("getConsoleLog not found")      })    }    var n = console.log, o = console.error, i = "";    console.error = function () {      o.apply(console, arguments), e(Array.prototype.slice.call(arguments))    }, console.log = function () {      n.apply(console, arguments), e(Array.prototype.slice.call(arguments))    }, sharedGlobals.getConsoleLog = function (e) {      e(i)    }, window.gistConsoleLog = function (e, n) {      chrome.runtime.getBackgroundPage(function (o) {        t(o).then(function (n) {          e["background.txt"] = n;          var o = chrome.app.window.getAll(), i = o.map(function (n) {            return t(n.contentWindow).then(function (t) {              e["window-" + n.id + ".txt"] = t            })          });          return Promise.all(i)        }).then(function () {          var t = {description: chrome.runtime.getManifest().name + " console log", public: !1, files: e};          fetch("https://api.github.com/gists", {method: "POST", body: JSON.stringify(t)}).then(function (e) {            e.json().then(function (e) {              n(e.html_url)            })          })        })      })    }  }(), function () {    function e(e) {      this.buffer = new ArrayBuffer(e), this.dataView = new DataView(this.buffer), this.uint8array = new Uint8Array(this.buffer), this.littleEndian = !1, this.position = 0, this.limit = e, this.capacity = e    }    function t(t, n) {      var o = 8 * n, i = t + o, r = "get" + i, s = "set" + i, c = "put" + i;      e.prototype[r] = function () {        if (this.position + n > this.limit)throw new Error("Not enough room in byte buffer");        var e = this.dataView[r](this.position, this.littleEndian);        return this.position += n, e      }, e.prototype[c] = function (e) {        if (this.position + n > this.limit)throw new Error("Not enough room in byte buffer");        if (null == e || void 0 == e || NaN == e || e.constructor != Number)throw new Error("no value provided");        return this.dataView[s](this.position, e, this.littleEndian), this.position += n, this      }    }    e.prototype.flip = function () {      this.limit = this.position, this.position = 0    }, e.prototype.asUint8Array = function () {      return this.uint8array.subarray(this.position, this.limit)    };    var n = {Int: [1, 2, 4], Uint: [1, 2, 4], Float: [4, 8]};    for (var o in n) {      var i = n[o];      for (var r in i) {        var r = i[r];        t(o, r)      }    }    e.prototype.put = function (e) {      if (e.constructor == Number)return this.putInt8(e);      if (e.constructor == String && (e = c(e)), e.constructor == ArrayBuffer && (e = new Uint8Array(e)), this.position + e.byteLength > this.limit)throw new Error("Not enough room in byte buffer");      return this.uint8array.set(e, this.position), this.position += e.byteLength, this    }, e.prototype.putByte = e.prototype.putInt8, e.prototype.putShort = e.prototype.putInt16, e.prototype.putInt = e.prototype.putInt32, e.prototype.putFloat = e.prototype.putFloat32, e.prototype.putDouble = e.prototype.putFloat64, window.ByteBuffer = e  }(), window.chrome && window.chrome.sockets && (chrome.sockets.tcp.onReceive.addListener(function (e) {    var t = Socket.readers[e.socketId];    null != t && t.dataReceived(new Uint8Array(e.data))  }), chrome.sockets.tcp.onReceiveError.addListener(function (e) {    var t = Socket.readers[e.socketId];    null != t && (t.destroy(), t.dataReceived(null))  }), chrome.sockets.tcpServer.onAccept.addListener(function (e) {    chrome.sockets.tcp.setPaused(e.clientSocketId, !1);    var t = Server.listeners[e.socketId];    null != t && t(new Socket({socketId: e.clientSocketId}))  })), function () {    function e(t, n) {      if (t.socketId) this.socketId = t.socketId, e.readers[this.socketId] = this; else if (window.chrome && window.chrome.sockets) chrome.sockets.tcp.create(function (o) {        this.socketId = o.socketId, chrome.sockets.tcp.connect(this.socketId, t.host, t.port, function (t) {          t ? (chrome.runtime.lastError, this.destroy(), n(null)) : (e.readers[o.socketId] = this, n(this))        }.bind(this))      }.bind(this)); else {        var o;        t.ns ? (this.ns = t.ns, o = !0) : (this.ns = new require("net").Socket(), this.ns.connect({          port: t.port,          host: t.host        }, function () {          o = !0, n(this)        }.bind(this))), this.ns.on("close", function () {          this.destroy(), o || n(null)        }.bind(this)), this.ns.on("data", function (e) {          this.dataReceived(e)        }.bind(this))      }    }    function t() {    }    e.readers = {}, e.connect = function (t, n) {      return new e(t, n)    }, e.pump = function (e, t, n) {      if (!e || !t)return console.error("Socket.pump called with null socket", e, t), void n();      var o = function () {        e.read(i)      }.bind(e), i = function (e) {        var n = e.buffer;        (e.byteOffset || e.length != n.byteLength) && (n = n.slice(e.byteOffset, e.byteOffset + e.length)), t.write(n, o)      }.bind(t);      e.read(i), e.onClose = n    }, e.stream = function (t, n, o) {      e.pump(t, n, function () {        if (n && n.destroy(), o) {          var e = o;          o = null, e()        }      }), e.pump(n, t, function () {        if (t && t.destroy(), o) {          var e = o;          o = null, e()        }      })    }, e.eat = function (e) {      function t() {        e.read(t)      }      t()    }, e.prototype.read = function () {      if (this.pendingCallback)throw new Error("double callback");      if (this.closed && !this.pending) {        var e = this.onClose;        return void(e && (delete this.onClose, e()))      }      var t = 0;      "Number" == arguments[t].constructor.name ? this.pendingLength = arguments[t++] : this.pendingLength = 0;      var e = arguments[t];      if (!this.pending || this.paused)return void(this.pendingCallback = e);      if (this.pendingLength) {        if (this.pendingLength > this.buffered())return void(this.pendingCallback = e)      } else this.pendingLength = this.buffered();      for (var n, o = 0; o < this.pendingLength;) {        var i = this.pending.shift();        this.bufferedLength -= i.length, this.pending.length || delete this.pending;        var r = i, s = Math.min(r.byteLength, this.pendingLength - o);        if (s != r.byteLength) {          var c = r.subarray(0, s), a = r.subarray(s);          this.unshift(a), r = c;        }        n || r.byteLength == this.pendingLength || (n = new Uint8Array(this.pendingLength)), n ? n.set(r, o) : n = r, o += r.byteLength      }      e(n)    }, e.prototype.write = function (e, t) {      if (this.pendingWrite && console.error("write is already in progress!"), null == t && (console.error("write callback is null?"), t = function () {        }), this.pendingWrite = t, window.chrome && window.chrome.sockets) chrome.sockets.tcp.send(this.socketId, e, function (n) {        return chrome.runtime.lastError, !n || n.resultCode ? void delete this.pendingWrite : void(n.bytesSent < e.byteLength ? this.write(e.slice(n.bytesSent), t) : (delete this.pendingWrite, t()))      }.bind(this)); else {        if (!this.ns)return;        if (!e.byteLength)return void require("process").nextTick(function () {          delete this.pendingWrite, t()        }.bind(this));        const n = window.Buffer || require("buffer").Buffer;        this.ns.write(n.from(e), function () {          delete this.pendingWrite, t()        }.bind(this))      }    }, e.prototype.destroy = function (e, t) {      window.chrome && window.chrome.sockets ? chrome.sockets.tcp.close(this.socketId, function () {        chrome.runtime.lastError      }) : (this.dataReceived(null), this.ns && (this.ns.destroy(), delete this.ns))    }, e.prototype.unshift = function (e) {      0 != e.byteLength && (this.pending ? this.pending.unshift(e) : this.pending = [e], this.bufferedLength || (this.bufferedLength = 0), this.bufferedLength += e.length)    }, e.prototype.dataReceived = function (e) {      if (e && (e.asUint8Array && (e = e.asUint8Array()), e.constructor == ArrayBuffer && (e = new Uint8Array(e))), e && e.length) {        var t = new Uint8Array(e);        this.pending ? this.pending.push(t) : this.pending = [t]      }      if (null == e ? this.closed = !0 : (this.bufferedLength || (this.bufferedLength = 0), this.bufferedLength += e.length), this.paused || !this.pending || !this.pending.length) {        var n = this.onClose;        return void(this.closed && n && (delete this.onClose, n()))      }      var o = this.pendingLength, n = this.pendingCallback;      n && (delete this.pendingCallback, this.read(o, n))    }, e.prototype.buffered = function () {      return this.bufferedLength    }, e.prototype.pause = function () {      this.paused || (this.paused = !0, this.onPause())    }, e.prototype.resume = function () {      this.paused && (this.paused = !1, this.onResume())    }, e.prototype.onResume = function () {      chrome.sockets.tcp.setPaused(this.socketId, !1, function () {      })    }, e.prototype.onPause = function () {      chrome.sockets.tcp.setPaused(this.socketId, !0, function () {      })    }, t.listeners = {}, t.prototype.__proto__ = e.prototype, t.prototype.destroy = function () {      window.chrome && window.chrome.sockets ? chrome.sockets.tcpServer.close(this.socketId, function () {        chrome.runtime.lastError      }) : this.ns && (this.ns.close(), delete this.ns)    }, t.prototype.listen = function (n, o, i) {      var r, s;      "Number" == n.constructor.name ? (r = n, s = "0.0.0.0") : (s = n.address, r = n.port), window.chrome && window.chrome.sockets ? chrome.sockets.tcpServer.create(function (e) {        this.socketId = e.socketId, t.listeners[this.socketId] = o, chrome.sockets.tcpServer.listen(e.socketId, s, r, function (e) {          return chrome.runtime.lastError, e ? (this.destroy(), void(i && i(e))) : void chrome.sockets.tcpServer.getInfo(this.socketId, function (t) {            this.localAddress = t.localAddress, this.localPort = t.localPort, i && i(e)          }.bind(this))        }.bind(this))      }.bind(this)) : (this.ns = require("net").createServer(function (t) {        o(new e({ns: t}))      }.bind(this)), this.ns.on("close", function () {        this.destroy()      }.bind(this)), this.ns.on("error", function (e) {        i && i(e)      }.bind(this)), this.ns.on("listening", function () {        var e = this.ns.address();        this.localAddress = e.address, this.localPort = e.port, i && i()      }.bind(this)), this.ns.listen({port: r, host: s}))    }, window.Socket = e, window.Server = t  }(), function () {    function e() {    }    function t(e) {      this.request = e, this.statusLine = "HTTP/1.1 200 OK", this.headers = {Date: (new Date).toUTCString()}    }    function n(e, n, o) {      this.server = e, this.socket = n, this.headers = {}, this.parseRequest(function () {        o(this, new t(this))      }.bind(this))    }    e.prototype.listen = function (e, t, n) {      this.socket = new Server, this.requestCallback = t, this.socket.listen(e, this.onSocket.bind(this), n)    }, e.prototype.onSocket = function (e) {      new n(this, e, this.requestCallback)    }, e.prototype.destroy = function () {      this.socket.destroy()    }, t.prototype.code = function (e) {      this.statusLine = "HTTP/1.1 " + e + " " + HttpResponseCodes[e]    }, t.prototype.write = function (e, t) {      if (e.constructor.name == Object.prototype.constructor.name && (e = JSON.stringify(e)), e.constructor.name == String.prototype.constructor.name && (e = c(e)), !this.hasWritten) {        this.hasWritten = !0, this.headers["Content-Length"] || "close" == this.headers.Connection || (this.headers["Content-Length"] = e.byteLength);        var n = [this.statusLine];        for (var o in this.headers)n.push(o + ": " + this.headers[o]);        var i = n.join("\r\n") + "\r\n\r\n";        return void this.request.socket.write(c(i), function () {          this.write(e, t)        }.bind(this))      }      this.request.socket.write(e, t)    }, t.prototype.end = function () {      "close" == this.headers.Connection ? this.request.socket.destroy() : this.request.server.onSocket(this.request.socket), this.request.socket = null    }, n.prototype.parseRequest = function (e) {      var t = function () {        d(this.socket, function (n) {          if (n = n.trim(), !n.length) {            var o = this.headers["content-length"];            return o ? (o = Number.parseInt(o), void this.socket.read(o, function (t) {              this.body = t, "application/json" === this.headers["content-type"] && (this.body = JSON.parse(s(this.body))), e()            }.bind(this))) : void e()          }          if (this.statusLine) {            var i = n.split(":", 2);            2 == i.length && (this.headers[i[0].toLowerCase()] = i[1].trim())          } else {            this.statusLine = n;            var i = n.split(" ");            if (i.length > 2 && (i = i[1].split("?"), this.path = i[0], this.queries = {}, i.length > 1))for (var r = this.query = i[1], c = r.split("&"), a = 0; a < c.length; a++) {              var d, l = c[a].split("="), u = l[0];              l.length > 1 && (d = l[1]), this.queries[u] = d            }          }          t()        }.bind(this))      }.bind(this);      t()    }, window.HttpRequestParser = n, window.HttpServer = e, window.HttpResponseCodes = {      200: "OK",      202: "Accepted",      206: "Partial Content",      101: "Switching Protocols",      301: "Moved Permanently",      302: "Found",      402: "Payment Required",      404: "Not Found"    }  }(), b.prototype.write = function (e, t) {    throw new Error("write not supported on dummy socket")  }, b.prototype.destroy = function () {    this.dataReceived(null)  }, b.prototype.buffered = Socket.prototype.buffered, b.prototype.unshift = Socket.prototype.unshift, b.prototype.dataReceived = Socket.prototype.dataReceived, b.prototype.read = Socket.prototype.read, b.prototype.pause = Socket.prototype.pause, b.prototype.resume = Socket.prototype.resume, b.prototype.buffered = Socket.prototype.buffered, b.prototype.onPause = function () {  }, b.prototype.onResume = function () {  }, k.connect = function (e, t) {    new k(e, t)  }, k.prototype.write = function (e, t) {    throw new Error("write not supported on fetch socket")  }, k.prototype.destroy = function () {    this.promise && this.promise.cancel && this.promise.cancel()  }, k.prototype.unshift = Socket.prototype.unshift, k.prototype.dataReceived = Socket.prototype.dataReceived, k.prototype.read = Socket.prototype.read, k.prototype.pause = Socket.prototype.pause, k.prototype.resume = Socket.prototype.resume, k.prototype.buffered = Socket.prototype.buffered, k.prototype.onPause = function () {  }, k.prototype.onResume = function () {    this.reader.read().then(function (e) {      e.value && (this.dataReceived(e.value), this.paused || this.onResume())    }.bind(this))  }, function () {    function e(e, t) {      this.conn = e, this.dc = t, this.gotEof = !1, t.onmessage = function (e) {        var t = new Uint8Array(e.data), n = 1 == t[t.byteLength - 1];        this.dataReceived(t.subarray(0, t.byteLength - 1)), n && (this.gotEof = !0, this.destroy())      }.bind(this), t.onclose = t.onerror = this.destroy.bind(this), this.needsBufferShim = !0    }    function t(e, t, n) {      this.manager = e, this.pc = t, this.key = n, this.pc.oniceconnectionstatechange = function () {        "new" != this.pc.iceConnectionState && "checking" != this.pc.iceConnectionState && delete e.gcmRtcConnections[n], "disconnected" != this.pc.iceConnectionState && "closed" != this.pc.iceConnectionState || this.destroy()      }.bind(this)    }    function n(e, t, n) {      this.senders = e, this.registrationId = t, this.rtcc = n, this.gcmRtcConnections = {}, this.gcmRtcListeners = {}    }    e.prototype.buffered = Socket.prototype.buffered, e.prototype.unshift = Socket.prototype.unshift, e.prototype.dataReceived = Socket.prototype.dataReceived, e.prototype.read = Socket.prototype.read, e.prototype.pause = Socket.prototype.pause, e.prototype.resume = Socket.prototype.resume, e.prototype.buffered = Socket.prototype.buffered, e.prototype.writeable = function () {      var e = this.writeCallback;      e && (delete this.writeCallback, e())    }, e.prototype.write = function (e, t) {      if (!this.dc || "open" != this.dc.readyState)return void this.destroy();      this.writeCallback = t;      var n = new Uint8Array(e.byteLength + 1);      if (n.set(new Uint8Array(e)), this.dc.send(n.buffer), !this.reentrantWrite)try {        for (this.reentrantWrite = !0; this.writeCallback && (0 == this.dc.bufferedAmount || this.needsBufferShim);)this.writeable()      } finally {        this.reentrantWrite = !1      }    }, e.prototype.destroy = function () {      if (this.dataReceived(null), null != this.dc) {        var e = this.dc;        if (this.dc = null, e.onclose = null, e.onerror = null, "open" == e.readyState)try {          e.send(new Uint8Array([1])), this.gotEof ? this.conn.recycleChannel(e) : this.conn.waitForEof(e)        } catch (e) {        }      }    }, t.prototype.waitForCommand = function (t) {      t.onmessage = function (n) {        if (1 != n.data.byteLength) {          this.removeChannel(t);          var o = s(n.data), i = new e(this, t);          this.openSocket(o, i)        }      }.bind(this)    }, t.prototype.compactChannels = function () {      this.inboundChannels && !this.inboundChannels.length && (this.inboundChannels = null), this.outboundChannels && !this.outboundChannels.length && (this.outboundChannels = null)    }, t.prototype.getAppropriateChannels = function (e, t) {      var n;      return e.inbound ? (!this.inboundChannels && t && (this.inboundChannels = []), n = this.inboundChannels) : (!this.outboundChannels && t && (this.outboundChannels = []), n = this.outboundChannels), n    }, t.prototype.removeChannel = function (e) {      if (channels = this.getAppropriateChannels(e), channels) {        var t = channels.indexOf(e);        t != -1 && (channels.splice(t, 1), this.compactChannels())      }    }, t.prototype.waitForEof = function (e) {      e.onmessage = function (t) {        var n = new Uint8Array(t.data), o = 1 == n[n.byteLength - 1];        o && this.recycleChannel(e)      }.bind(this)    }, t.prototype.recycleChannel = function (e) {      var t = this.getAppropriateChannels(e, !0);      t.push(e), e.onclose = e.onerror = function () {        this.removeChannel(e)      }.bind(this), this.waitForCommand(e)    }, t.prototype.addCandidates = function (e) {      for (var t in e.candidates)this.pc.addIceCandidate(new RTCIceCandidate(e.candidates[t]))    }, t.prototype.setupPinger = function (e) {      function t() {        e.send(c("ping")), n = setTimeout(t, 1e3)      }      var n;      e.onmessage = function (e) {      }, e.onclose = e.onerror = function () {        clearTimeout(n), this.destroy()      }.bind(this), t()    }, t.prototype.listenSockets = function () {      this.pc.ondatachannel = function (e) {        e.channel.inbound = !0, this.waitForCommand(e.channel)      }.bind(this)    }, t.prototype.prepareChannel = function (e) {      var t = this.pc.createDataChannel(e || "gcm", {reliable: !0, ordered: !0});      return t.binaryType = "arraybuffer", t    }, t.prototype.newSocket = function (t, n) {      if ("closed" == this.pc.signalingState)return void n();      if (this.outboundChannels) {        var o = this.outboundChannels.shift();        this.compactChannels(), o.send(c(t));        var i = new e(this, o);        return void n(i, this)      }      var o = this.prepareChannel("gcm");      o.onopen = function () {        o.send(c(t));        var i = new e(this, o);        n(i, this)      }.bind(this)    }, t.prototype.destroy = function () {      delete this.manager.gcmRtcConnections[this.key], "closed" != this.pc.signalingState && this.pc.close();      var e = this.onClose;      e && (delete this.onClose, e())    }, n.prototype.onMessage = function (e) {      var t = JSON.parse(e.message), o = e.type, i = e.senderId, r = e.src, s = e.srcPort, c = e.dstPort;      if ("offer" == o) {        var a = this.gcmRtcListeners[c];        return void(a ? a.listener.incoming(i, r, s, c, t, a.listenCallback) : console.log("not listening on " + c))      }      if ("answer" == o) {        var d = n.getKey(r, s, c), l = this.gcmRtcConnections[d];        return l ? void l.manager.incoming(i, r, s, c, t) : void console.log("pending connection not found")      }      n.onUnknownMessage ? n.onUnknownMessage(e) : console.log("unknown message " + o)    }, n.hasLoadedChannels = !1, n.start = function (e, t, o) {      if (console.log("starting GtcRtcManger"), window.chrome && window.chrome.gcm) {        var i = Object.keys(e);        chrome.gcm.register(i, function (i) {          if (chrome.runtime.lastError, !i)return void o();          var r = new n(e, i, t);          chrome.gcm.onMessage.addListener(function (e) {            r.onMessage(e.data)          }), o(r)        })      } else {        var r = new n(e, null, t);        $.getScript("https://push.clockworkmod.com/socket.io/socket.io.js", function () {          var e = io("https://push.clockworkmod.com");          e.on("registration", function (e) {            e = "web:" + e, r.registrationId ? (r.registrationId = e, r.onRegistrationIdChanged && r.onRegistrationIdChanged(e)) : (r.registrationId = e, o(r))          }), e.on("data", function (e) {            r.onMessage(e)          })        })      }    }, n.prototype.ensureChannel = function () {      function e() {        return delete n.channelPromise, n.gcmRtcConnections = {}, n.channel && (delete n.channel, !Object.keys(n.gcmRtcListeners).length) ? void console.log("not reconnecting, no listeners") : void t()      }      function t() {        console.error("scheduling gcm reconnect"), n.reconnectTimeout = g(n.reconnectTimeout, null, 3e5, function () {          console.error("reconnecting gcm"), n.ensureChannel()        })      }      if (this.channel)return Promise.resolve();      var n = this;      return this.channelPromise ? this.channelPromise : this.channelPromise = new Promise(function (o, i) {        $.ajax({          type: "GET", url: "https://vysor-1026.appspot.com/listen", error: function () {            delete n.channelPromise, console.error("error ensuring gcm channe", error), t()          }, success: function (t) {            var i = new goog.appengine.Channel(t.token), r = {              onopen: function () {                n.channel = i;                var e = "web:" + t.channel;                n.registrationId = e, n.onRegistrationIdChanged && n.onRegistrationIdChanged(e), o()              }, onmessage: function (e) {                n.onMessage(JSON.parse(e.data))              }, onerror: function () {                console.error("gcm onerror", arguments), e()              }, onclose: function () {                console.error("gcm onclose", arguments), e()              }            };            i.open(r)          }        })      })    }, n.prototype.sendGcm = function (e, t, n, o, i, r) {      e || (e = this.defaultSenderId), t.startsWith("web:") ? $.ajax({        type: "POST",        url: "https://vysor-1026.appspot.com/send",        data: JSON.stringify({          channel: t.substring(4),          data: {senderId: e, src: this.registrationId, srcPort: o, dstPort: n, type: i, message: JSON.stringify(r)}        }),        contentType: "application/json",        dataType: "json",        success: function () {        }      }) : $.ajax({        type: "POST",        url: "https://gcm-http.googleapis.com/gcm/send",        headers: {Authorization: "key=" + this.senders[e]},        data: JSON.stringify({          to: t,          data: {senderId: e, src: this.registrationId, srcPort: o, dstPort: n, type: i, message: JSON.stringify(r)}        }),        contentType: "application/json",        dataType: "json",        error: function () {          console.log("gcm error", arguments)        },        success: function () {          console.log("gcm", arguments)        }      })    }, n.getKey = function (e, t, n) {      return n + ":" + t + ":" + e    }, n.prototype.setupPeerConnection = function (e, o, i, r, s, c) {      var a, d = window.RTCPeerConnection || window.webkitRTCPeerConnection, l = new d(this.rtcc), u = function (t) {        var n = [];        for (var a in t)a = t[a], n.push(a), JSON.stringify(n).length > 3200 && (this.sendGcm(o, i, r, s, e, {          desc: c(),          candidates: n        }), n = []);        n.length > 0 && this.sendGcm(o, i, r, s, e, {desc: c(), candidates: n})      }.bind(this);      l.onicecandidate = function (e) {        null != e.candidate && (console.log(e.candidate), a = g(a, e.candidate, 500, u))      }.bind(this);      var h = n.getKey(i, r, s), f = new t(this, l, h);      return l.onsignalingstatechange = function (e) {        "stable" == l.signalingState ? this.gcmRtcConnections[h] == f : "closed" == l.signalingState && f.destroy()      }.bind(this), this.gcmRtcConnections[h] = f, f    }, n.gcmPortCount = 0, n.prototype.connect = function (e, t) {      function o(e) {        l.createOffer(e).then(function (e) {          i = e, l.setLocalDescription(e)        })      }      var i, r = e.senderId, s = e.registrationId, c = e.port, a = n.gcmPortCount++,        d = this.setupPeerConnection("offer", r, s, c, a, function () {          return i        }), l = d.pc;      if (e.audio) navigator.webkitGetUserMedia({audio: !0, video: !1}, function (e) {        l.addStream(e), l.onaddstream = function (e) {          console.log("got the remote stream"), t(d, e)        }, o({offerToReceiveAudio: !0, offerToReceiveVideo: !1, voiceActivityDetection: !1})      }, function () {        console.error("audio fail", arguments), o({          offerToReceiveAudio: !0,          offerToReceiveVideo: !1,          voiceActivityDetection: !1        })      }); else {        var u = d.prepareChannel("pinger");        u.onopen = function () {          console.log("got rtc pinger"), d.setupPinger(u), t(d)        }, d.listenSockets(), o({})      }    }, n.prototype.isListening = function (e) {      return null != this.gcmRtcListeners[e]    }, n.prototype.stopListen = function (e) {      delete this.gcmRtcListeners[e]    }, n.prototype.listen = function (e, t) {      return this.gcmRtcListeners[e] ? void console.log("already listening on gcm port " + e) : void(this.gcmRtcListeners[e] = {        listener: this,        listenCallback: t      })    }, n.prototype.incoming = function (e, t, o, i, r, s) {      var c = n.getKey(t, o, i), a = this.gcmRtcConnections[c];      if (a) {        if (!a.remoteDesc) {          a.remoteDesc = new RTCSessionDescription(r.desc);          var d = a.pc;          d.setRemoteDescription(a.remoteDesc)        }      } else {        var l;        a = this.setupPeerConnection("answer", e, t, o, i, function () {          return l        }), a.remoteDesc = new RTCSessionDescription(r.desc);        var d = a.pc;        d.ondatachannel = function (e) {          console.log("got rtc pinger"), this.setupPinger(e.channel), s(a), this.listenSockets()        }.bind(a), d.setRemoteDescription(a.remoteDesc, function () {          d.createAnswer().then(function (e) {            l = e, d.setLocalDescription(e)          }, function () {            console.error("answer error", arguments)          })        })      }      a.addCandidates(r)    }, window.GcmRtcSocket = e, window.GcmRtcManager = n  }(), function () {    function e(e, t) {      this.handle = e, this.iface = t, this.type = "usb";      for (var n in t.endpoints)n = t.endpoints[n], "bulk" == n.type && (this.zero_mask = n.maximumPacketSize - 1, "in" == n.direction ? this.in = n : this.out = n)    }    function t(e) {      this.socket = e, this.zero_mask = (1 << 30) - 1, this.type = "tcp", e.onClose = function () {        var e = this.currentRead;        e && (delete this.currentRead, e({resultCode: -1}))      }.bind(this)    }    function n(e, t) {      this.onConnected = t, this.transport = e, this.currentSocketId = 0, this.sockets = {}, this.forwards = {}, this.maxPayload = n.MAX_PAYLOAD    }    function i(e) {      var t = {};      "String" != e.constructor.name && (e = s(e));      var n = e.replace("device::", "").split(";");      for (var o in n) {        o = n[o];        var i = o.split("=");        2 == i.length && (t[i[0]] = i[1])      }      return t    }    function r(e, t, n) {      n || (n = function () {      }), this.device = e, this.localId = t, this.onConnected = n    }    function a(t, o, i) {      console.log("connecting");      var r = new n(new e(t, o), i);      console.log("sending CNXN"), r.sendMessage(n.kCommandCNXN, n.ADB_PROTOCOL_VERSION, n.MAX_PAYLOAD, "host::"), console.log("starting receive loop"), r.receiveMessages()    }    function d(e) {      var e = e || {}, t = e.port || 5037, n = e.start !== !1;      this.currentSocketId = 0, this.pendingDevices = {}, this.port = t, this.adbDevices = {}, this.clients = {}, n && this.start()    }    function u() {      return (new Date).getTime()    }    function f(e, t) {      this.server = e, this.socket = t    }    e.prototype.destroy = function () {      chrome.usb.releaseInterface(this.handle, this.iface.interfaceNumber, function () {        chrome.runtime.lastError, chrome.usb.closeDevice(this.handle, function () {          chrome.runtime.lastError        })      }.bind(this))    }, e.prototype.write = function (e, t) {      if (this.writing)return this.pendingWrites || (this.pendingWrites = []), void this.pendingWrites.push({        data: e,        callback: t      });      var n = {direction: "out", endpoint: this.out.address, data: e};      this.writing = !0, chrome.usb.bulkTransfer(this.handle, n, function (e) {        if (chrome.runtime.lastError, this.writing = !1, t(e), this.pendingWrites) {          var n = this.pendingWrites.shift();          this.pendingWrites.length || (this.pendingWrites = null), this.write(n.data, n.callback)        }      }.bind(this))    }, e.prototype.read = function (e, t) {      var n = {direction: "in", endpoint: this.in.address, length: e};      chrome.usb.bulkTransfer(this.handle, n, function (e) {        chrome.runtime.lastError, t(e)      })    }, t.prototype.destroy = function () {      this.socket.destroy()    }, t.prototype.write = function (e, t) {      return this.writing ? (this.pendingWrites || (this.pendingWrites = []), void this.pendingWrites.push({        data: e,        callback: t      })) : (this.writing = !0, void this.socket.write(e, function () {        if (this.writing = !1, t({resultCode: 0}), this.pendingWrites) {          var e = this.pendingWrites.shift();          this.pendingWrites.length || (this.pendingWrites = null), this.write(e.data, e.callback)        }      }.bind(this)))    }, t.prototype.read = function (e, t) {      this.currentRead = t, this.socket.read(e, function (e) {        delete this.currentRead, t({resultCode: 0, data: e.buffer.slice(e.byteOffset, e.byteOffset + e.byteLength)})      })    }, n.prototype.fatal = function (e) {      console.log("fatal error", JSON.stringify(e));      var t = this.onConnected;      t ? (delete this.onConnected, t()) : this.onError && (this.onError(), delete this.onError), this.destroy()    }, n.prototype.destroy = function () {      for (var e in this.sockets)e = this.sockets[e], e.dataReceived(null);      this.forwards && $.each(this.forwards, function (e, t) {        t.destroy()      }), this.transport.destroy()    }, n.kCommandSYNC = 1129208147, n.kCommandCNXN = 1314410051, n.kCommandOPEN = 1313165391, n.kCommandOKAY = 1497451343, n.kCommandCLSE = 1163086915, n.kCommandWRTE = 1163154007, n.kCommandAUTH = 1213486401, n.kAuthToken = 1, n.kAuthSignature = 2, n.kAuthRSAPublicKey = 3, n.ADB_PROTOCOL_VERSION = 16777216, n.ADB_VERSION = 39, n.MAX_PAYLOAD = 4096, n.checksum = function (e) {      e = new Uint8Array(e);      for (var t = 0, n = 0; n < e.byteLength; n++)t += e[n];      return 4294967295 & t    }, n.prototype.sendMessage = function (e, t, o, i, r) {      i || (i = ""), "String" == i.constructor.name && (i = c(i));      var s = !0;      i.byteLength || (s = !1), e == n.kCommandAUTH && t == n.kAuthSignature && (s = !1), e == n.kCommandWRTE && (s = !1);      var a = i.byteLength;      if (s && a++, s) {        var d = new ArrayBuffer(i.byteLength + 1), l = new Uint8Array(d);        l.set(new Uint8Array(i)), l[d.byteLength - 1] = 0, i = d      }      var u = new ArrayBuffer(24), l = new DataView(u);      l.setUint32(0, e, !0), l.setUint32(4, t, !0), l.setUint32(8, o, !0), l.setUint32(12, a, !0), l.setUint32(16, n.checksum(i), !0), l.setUint32(20, 4294967295 ^ e, !0), this.transport.write(u, function (e) {        e.resultCode && this.fatal(e), !i.byteLength && r && r()      }.bind(this)), i.byteLength && this.transport.write(i, function (e) {        e.resultCode && this.fatal(e), r && r()      }.bind(this))    }, n.prototype.getKey = function (e) {      chrome.storage.local.get("adbkey", function (t) {        var n = t.adbkey, o = new JSEncrypt({default_key_size: 2048});        n ? o.setPrivateKey(n) : (n = o.getPrivateKeyB64(), o.setPrivateKey(n), chrome.storage.local.set({adbkey: n})), e(o)      })    }, n.prototype._convertToMinCrypt = function (e) {      var t = 2048, n = t / 8 / 4, o = BigInteger.ONE.shiftLeft(32), i = e.n.clone(),        r = BigInteger.ONE.shiftLeft(1).pow(t), s = r.multiply(r).mod(i), c = new Uint32Array(3 + 2 * n);      c[0] = n, c[1] = o.subtract(i.modInverse(o)).intValue();      for (var a = n + 2, d = 2, l = 2 + n; d < a; ++d, ++l)c[d] = i.mod(o).intValue(), i = i.divide(o), c[l] = s.mod(o).intValue(), s = s.divide(o);      c[c.length - 1] = e.e;      for (var u = "", h = new Uint8Array(c.buffer), d = 0; d < h.length; ++d) {        var f = h[d].toString(16);        1 == f.length && (u += "0"), u += f      }      return p(u) + " adb@chrome"    }, n.prototype.sign = function (e, t) {      if (null == e)throw"AuthManager is not initialized";      var n = 256, o = new Uint8Array(n);      o[0] = 0, o[1] = 1;      for (var i = [0, 48, 33, 48, 9, 6, 5, 43, 14, 3, 2, 26, 5, 0, 4, 20], r = n - i.length - t.byteLength, s = 2; s < r; s++)o[s] = 255;      o.set(new Uint8Array(i), r), r += i.length, o.set(new Uint8Array(t), r);      var c = new BigInteger(Array.apply([], o));      return new Uint8Array(e.doPrivate(c).toByteArray()).buffer    }, n.parseConnectionPayload = i, n.prototype.handleUnknown = function (e, t) {      console.log("no idea what this socket is."), this.sendMessage(n.kCommandCLSE, e, t)    }, n.prototype.handleMessage = function (e, t) {      var o = e.getUint32(0, !0), r = e.getUint32(4, !0), c = e.getUint32(8, !0);      e.getUint32(12, !0), e.getUint32(16, !0);      switch (o) {        case n.kCommandOPEN:          this.onOpenSocket && this.onOpenSocket(t, r);          break;        case n.kCommandAUTH:          console.log("auth:", this), this.getKey(function (e) {            if (this.sentSignature) {              var o = this._convertToMinCrypt(e.getKey());              this.sendMessage(n.kCommandAUTH, n.kAuthRSAPublicKey, 0, o), m('Check your Android device and click "Allow USB Debugging".')            } else {              this.sentSignature = !0;              var i = this.sign(e.getKey(), t);              this.sendMessage(n.kCommandAUTH, n.kAuthSignature, 0, i, function () {              })            }          }.bind(this));          break;        case n.kCommandOKAY:          var a = r, d = c, l = this.sockets[d];          if (!l)return void this.handleUnknown(d, a);          var u = l.onConnected;          u && (delete l.onConnected, l.remoteId = a, u(l));          var h = l.pendingWrite;          if (h)return u = l.wrote, delete l.wrote, delete l.pendingWrite, void l.write(h, u);          u = l.wrote, u && (delete l.wrote, u());          break;        case n.kCommandCNXN:          this.rawProperties = s(t), this.properties = i(t);          var u = this.onConnected;          u && (delete this.onConnected, u(this));          break;        case n.kCommandWRTE:          var a = r, d = c, l = this.sockets[d];          if (!l)return void this.handleUnknown(d, a);          l.paused || this.sendMessage(n.kCommandOKAY, l.localId, l.remoteId), l.dataReceived(new Uint8Array(t));          break;        case n.kCommandCLSE:          var a = r, d = c, l = this.sockets[d];          if (!l)return void console.log("asked to close unknown socket?");          delete this.sockets[d], l.destroy();          var u = l.onConnected;          u && (delete l.onConnected, u());          break;        default:          console.log("unknown command: ", o.toString(16), r, c, t)      }    }, n.prototype.onReceiveMessage = function (e) {      if (e.resultCode)return void this.fatal(e);      var t = new DataView(e.data), o = t.getUint32(12, !0);      if (o) this.transport.read(o, function (e) {        if (e.resultCode)return void this.fatal(e);        var o = e.data;        if (n.checksum(o) != t.getUint32(16, !0))return void this.receiveMessages();        try {          this.handleMessage(t, o)        } finally {          this.receiveMessages()        }      }.bind(this)); else try {        this.handleMessage(t, null)      } finally {        this.receiveMessages()      }    }, n.prototype.receiveMessages = function () {      this.transport.read(24, this.onReceiveMessage.bind(this))    }, n.prototype.forwardPort = function (e) {      var t = new Server;      t.listen({port: e.fromPort, address: "127.0.0.1"}, function (t) {        this.newSocket(e.to, function (e) {          e ? Socket.stream(t, e) : t.destroy()        }.bind(this))      }.bind(this), function () {        this.forwards[e.fromPort] = t      }.bind(this))    }, n.prototype.newAdbSocket = function (e, t) {      var n;      return n = this.createSocket ? this.createSocket(e, t) : new r(this, e, t)    }, n.prototype.newSocket = function (e, t) {      var o = ++this.currentSocketId;      this.sockets[o] = this.newAdbSocket(o, t), this.sendMessage(n.kCommandOPEN, o, 0, e)    }, r.prototype.write = function (e, t) {      if (this.pendingWrite || this.wrote)throw console.log("bad adb socket state, already writing"), new Error("bad adb socket state, already writing");      var o = Math.min(this.device.transport.zero_mask, this.device.maxPayload);      o < e.byteLength ? (this.pendingWrite = e.slice(o), e = e.slice(0, o)) : this.pendingWrite = null, this.wrote = t, this.device.sendMessage(n.kCommandWRTE, this.localId, this.remoteId, e)    }, r.prototype.destroy = function () {      this.device.sendMessage(n.kCommandCLSE, this.localId, this.remoteId), this.dataReceived(null)    }, r.prototype.buffered = Socket.prototype.buffered, r.prototype.dataReceived = Socket.prototype.dataReceived, r.prototype.read = Socket.prototype.read, r.prototype.pause = Socket.prototype.pause, r.prototype.resume = Socket.prototype.resume, r.prototype.unshift = Socket.prototype.unshift, r.prototype.onPause = function () {    }, r.prototype.onResume = function () {      this.device.sendMessage(n.kCommandOKAY, this.localId, this.remoteId)    }, d.prototype.start = function () {      if (this.server)return void console.log("ADB Server started while already started");      this.clients = {}, this.adbDevices = {}, this.pendingDevices = {}, this.refreshing = {};      var e = new Server;      e.listen({port: this.port, address: "127.0.0.1"}, function (e) {        var t = new f(this, e), n = ++this.currentSocketId;        this.clients[n] = t, e.onClose = function () {          delete this.clients[n]        }.bind(this), t.receiveHeader()      }.bind(this), function (t) {        return t ? void console.log("adb server failed to listen: " + t) : (console.log("ADB Server started"), this.server = e, void this.refresh())      }.bind(this))    }, d.prototype.isRunning = function () {      return null != this.server    }, d.prototype.kill = function () {      this.server.destroy(), this.server = null, this.refreshing = {};      for (var e in this.clients)e = this.clients[e], e.socket.destroy();      this.clients = {};      for (var t in this.adbDevices)t = this.adbDevices[t], t.destroy();      this.adbDevices = {}, this.pendingDevices = {}    }, d.prototype.selectDevice = function (e) {      chrome.usb.getUserSelectedDevices({        filters: [{          interfaceClass: 255,          interfaceSubclass: 66,          interfaceProtocol: 1        }]      }, function (t) {        for (var n in t)n = t[n], this.refreshDevice(n, e)      }.bind(this))    }, d.prototype.withAdbDevice = function (e, t) {      e.onError = function () {        delete this.adbDevices[e.serialno], this.internalOnDevicesChanged()      }.bind(this);      var n = function (n) {        e.serialno = n.trim(), this.adbDevices[e.serialno] = e, console.log("found device: " + e.serialno), this.internalOnDevicesChanged(), t(e)      }.bind(this);      return e.serialno ? void n(e.serialno) : void e.newSocket("shell:getprop ro.serialno", function (e) {        l(e, function (e) {          n(e)        }.bind(this))      }.bind(this))    }, d.prototype.tryDevice = function (e, t, n) {      function o(o) {        var s = o.interfaceNumber;        return !i[s] && (i[s] = e, console.log("claiming:", JSON.stringify(e), JSON.stringify(o)), chrome.usb.claimInterface(e, o.interfaceNumber, function () {            console.log("claimed:", JSON.stringify(chrome.runtime.lastError)), a(e, o, function (e) {              return e ? (e.serialno = t, void r.withAdbDevice(e, function (e) {                delete i[s], n(e)              })) : (delete i[s], void n())            })          }), !0)      }      var i = (this.adbDevices, this.pendingDevices), r = this;      chrome.usb.listInterfaces(e, function (t) {        if (!t)return console.log("unable list interfaces", JSON.stringify(chrome.runtime.lastError)), void(n && n());        console.log("got interfaces", JSON.stringify(t));        var i = !1;        for (var r in t)r = t[r], 255 == r.interfaceClass && 66 == r.interfaceSubclass && 1 == r.interfaceProtocol && (i |= o(r));        i || chrome.usb.closeDevice(e)      })    }, d.prototype.refreshDevice = function (e, t) {      chrome.usb.openDevice(e, function (n) {        return n ? (this.start(), void this.tryDevice(n, e.serialNumber, function (n) {          n && (n.usbDevice = e), t(n)        })) : (console.log("unable to open device", JSON.stringify(chrome.runtime.lastError)), void(t && t()))      }.bind(this))    }, d.prototype.refresh = function () {      if (!this.server)return void console.log("adb server refresh requested while server killed");      var e = u();      if (!(this.server.lastRefresh && this.server.lastRefresh > e - 1e4)) {        this.server.lastRefresh = e;        var t = chrome.runtime.getManifest().permissions.pop().usbDevices;        $(t).each(function (e, t) {          var n = t.vendorId + "&" + t.productId;          this.refreshing[n] || (this.refreshing[n] = !0, chrome.usb.findDevices({            productId: t.productId,            vendorId: t.vendorId          }, function (e) {            var o = e.length;            if (!o)return void delete this.refreshing[n];            console.log("found:", t, e);            for (var i in e)console.log("trying:", e[i]), this.tryDevice(e[i], e[i].serialNumber, function () {              o--, o || delete this.refreshing[n]            }.bind(this))          }.bind(this)))        }.bind(this))      }    }, d.prototype.internalOnDevicesChanged = function () {      for (var e in this.clients)if (e = this.clients[e], e.tracking) {        var t = e.getDevicesString();        t.length || (t = "0000\n"), e.socket.write(c(t), function () {        })      }    }, d.prototype.stop = function () {      this.server.destroy()    }, f.prototype.resolveTransport = function (e, t) {      if (t) {        var n = this.server.adbDevices[t];        return n ? n : "device not found"      }      var o = Object.keys(this.server.adbDevices);      if (o > 1)return "more than one device";      if (0 == o)return "no devices connected";      for (var i in this.server.adbDevices)return this.server.adbDevices[i]    }, f.prototype.write = function (e, t, n) {      t || (t = "OKAY"), e = c(e);      var i = e.byteLength, r = o(i);      r = c(t + r);      var s = h(new Uint8Array(r), new Uint8Array(e)).buffer;      n || (n = function () {        this.socket.destroy()      }.bind(this)), this.socket.write(s, n)    }, f.prototype.getDevicesString = function (e) {      var e = e || {}, t = e.longformDevices, n = "";      for (var o in this.server.adbDevices)o = this.server.adbDevices[o], n += o.serialno + "\tdevice", t && (n += "usb" == o.transport.type ? " usb:" + o.transport.iface.interfaceNumber : " tpcip:something", n += " product:" + o.properties["ro.product.name"], n += " model:" + o.properties["ro.product.model"], n += " device:" + o.properties["ro.product.device"]), n += "\n";      return n    }, f.prototype.writeDevices = function (e, t) {      this.write(this.getDevicesString(e), null, t)    }, f.prototype.handlePayload = function (e) {      e = s(e);      var i, r = e.split(":"), a = e;      switch ("host-serial" == r[0] && (r[0] = "host", i = r.splice(1, 1)[0], Number.isInteger(parseInt(r[1])) && (i += ":" + r.splice(1, 1)[0])), r.length >= 2 && (a = r[0] + ":" + r[1]), a) {        case"host:version":          this.write(o(n.ADB_VERSION));          break;        case"host:devices-l":        case"host:devices":          var d = "host:devices-l" == e;          this.server.refresh(), this.writeDevices({longformDevices: d});          break;        case"host:features":          var l = this.resolveTransport(e, i);          if ("String" == l.constructor.name) {            this.write(l, "FAIL");            break          }          var h = l.properties.features;          h || (h = ""), this.write(o(h));          break;        case"host:transport-usb":        case"host:transport-any":          var l = this.resolveTransport(e, i);          if ("String" == l.constructor.name) {            this.write(l, "FAIL");            break          }          this.transport = l, this.socket.write(c("OKAY"), function () {          });          break;        case"host:kill":          this.server.kill();          break;        case"host:disconnect":          if (r.length > 4) {            this.write("host:disconnect only takes 1 argument", "FAIL");            break          }          if (r.length > 2) {            var f = r[2];            if (f.length) {              var p = 5555;              r.length > 3 && (p = Number.parseInt(r[3]));              var v = f + ":" + p, g = this.server.adbDevices[v];              g && "tcp" == g.transport.type && g.destroy(), this.write("disconnected");              break            }          }          for (var g in this.server.adbDevices)g = this.server.adbDevices[g], "tcp" == g.transport.type && g.destroy();          this.write("disconnected");          break;        case"host:connect":          if (r.length < 3) {            this.write("need more arguments for connect <host>[:<port>]", "FAIL");            break          }          var f = r[2], p = 5555;          r.length > 3 && (p = Number.parseInt(r[3])), Socket.connect({host: f, port: p}, function (e, o) {            if (!e)return console.error("connect failed"), this.write("unable to connect to " + f + " " + p + ": " + o, "FAIL"), this;            var i = new n(new t(e), function (e) {              this.server.withAdbDevice(e, function () {                var e = "connected to " + f + ":" + p;                console.log(e), this.write(e)              }.bind(this))            }.bind(this));            i.serialno = f + ":" + p, e.onClose = function () {              i.fatal("socket closed")            }.bind(this), i.sendMessage(n.kCommandCNXN, n.ADB_PROTOCOL_VERSION, n.MAX_PAYLOAD, "host::"), i.receiveMessages()          }.bind(this));          break;        case"host:track-devices":          this.tracking = u(), this.writeDevices({}, function () {          });          break;        case"host:forward":          var m = r.join(":").substring(a.length + 1).split(";"), y = m[0].split(":"), w = parseInt(y[1]),            l = this.resolveTransport(e, i);          if ("String" == l.constructor.name) {            this.write(l, "FAIL");            break          }          l.forwardPort({fromPort: w, to: m[1]}), this.socket.write(c("OKAYOKAY"), function () {          }.bind(this));          break;        default:          if (this.transport) {            var l = this.transport;            return void l.newSocket(e, function (e) {              return e ? (this.socket.write(c("OKAY"), function () {              }), void Socket.stream(e, this.socket)) : void this.socket.write(c("OKAY"), function () {                this.socket.destroy()              }.bind(this))            }.bind(this))          }          var b = "host:transport:";          if (e.startsWith(b)) {            var i = e.substr(b.length), g = this.server.adbDevices[i];            if (!g)return void this.write("device not found", "FAIL");            this.transport = g, this.socket.write(c("OKAY"), function () {            });            break          }          console.log("unknown request: " + e), this.write("unknown command: " + e, "FAIL");          var k = chrome.runtime.getManifest().name;          chrome.notifications.create({            type: "basic",            iconUrl: "/icon.png",            title: k,            message: k + "'s adb server encountered an unknown adb command.\nYou may want to close " + k + " and start your adb binary manually."          })      }      this.receiveHeader()    }, f.prototype.receivePayload = function (e) {      var t = parseInt(s(e), 16);      this.socket.read(t, this.handlePayload.bind(this))    }, f.prototype.receiveHeader = function () {      this.socket.read(4, this.receivePayload.bind(this))    }, window.AdbDevice = n, window.AdbServer = d, window.AdbTcpTransport = t  }(), function () {    function e() {    }    var t = {};    t.sendHostCommand = function (e, t) {      Socket.connect({host: "127.0.0.1", port: 5037}, function (n) {        if (!n)return void t();        var i = e;        e = o(e.length) + e, n.read(4, function (e) {          var o = s(e);          return "OKAY" != o ? (console.error("error in response to adb host command", i, o), n.destroy(), void t()) : void n.read(4, function (e) {            var o = s(e);            return e = parseInt(o, 16), 0 == e || "OKAY" == o ? void t(n, new ArrayBuffer(0)) : void n.read(e, function (e) {              t(n, e)            })          })        }), n.write(c(e), function () {        })      })    }, t.devices = function (e) {      function n(e) {        var t = e;        e = e.replace("\t", " ");        var n = e.indexOf(" ");        if (n != -1) {          var i = e.substring(0, n);          e = e.substring(n).trim();          for (var r; r != e;)r = e, e = e.replace("  ", " ");          var s = {}, c = e.indexOf(" ");          c == -1 && (c = e.length);          var a = e.substring(0, c);          for (e = e.substring(c + 1); e.length && (n = e.indexOf(":"), n != -1);) {            var d, l = e.substring(0, n), u = e.substring(n + 1), h = u.indexOf(" "), f = u.indexOf(":");            if (h == -1 || f == -1) d = u, e = ""; else for (; h != -1 && h < f;)d = u.substring(0, h), e = u.substring(h + 1), h = u.indexOf(" ", h + 1);            s[l] = d          }          var p;          p = s.model ? s.model.replace("_", " ") : i, o[i] = {serialno: i, name: p, status: a, properties: t}        }      }      var o = {};      t.sendHostCommand("host:devices-l", function (t, i) {        if (!t)return void e();        t.destroy(), i = s(i), console.log("ADB devices:", i), i = i.trim();        var r = i.split("\n");        for (var c in r)c = r[c], n(c);        e(o)      })    }, t.killServer = function (e) {      t.sendHostCommand("host:kill-server", function (t, n) {        return t ? (t.destroy(), n = s(n), void(e && e())) : void e()      })    }, t.sendClientCommand = function (e, t) {      var n = e.command, i = e.serialno;      Socket.connect({host: "127.0.0.1", port: 5037}, function (e) {        if (!e)return void t();        e.read(4, function (i) {          var r = s(i);          if ("OKAY" != r)return e.destroy(), void t(null);          var a = n;          a = o(a.length) + a, e.read(4, function (n) {            var o = s(n);            return "OKAY" != o ? (e.destroy(), void t(null)) : void t(e)          }), e.write(c(a), function () {          })        });        var r = "host:transport:" + i;        r = o(r.length) + r, e.write(c(r), function () {        })      })    }, t.shell = function (e, n) {      var o = e.command;      e.serialno;      t.getOrCreateSockFactory(e).newSocket("shell:" + o, function (e) {        return e ? void l(e, function (e) {          n(e)        }) : void n()      })    }, t.forward = function (e, n) {      var o = "host-serial:" + e.serialno + ":forward:" + e.from + ";" + e.to;      t.sendHostCommand(o, function (e, t) {        e && e.destroy(), n(e, t)      })    }, e.MKID = function (e, t, n, o) {      return e.charCodeAt(0) | t.charCodeAt(0) << 8 | n.charCodeAt(0) << 16 | o.charCodeAt(0) << 24    }, e.ID_RECV = e.MKID("R", "E", "C", "V"), e.ID_SEND = e.MKID("S", "E", "N", "D"), e.ID_DONE = e.MKID("D", "O", "N", "E"), e.ID_DATA = e.MKID("D", "A", "T", "A"), e.DATA_MAX = 65536, t.pull = function (n, o) {      var i = n.file, r = (n.serialno, n.fileEntry), s = n.socket;      s || !function () {        var e;        s = {          write: function (t, n) {            return e ? (e.onwriteend = n, void e.write(new Blob([t]))) : void r.createWriter(function (o) {              e = o, s.write(t, n)            })          }        }      }();      var a = new b;      Socket.pump(a, s, function () {        o(r)      }), t.getOrCreateSockFactory(n).newSocket("sync:", function (t) {        function n(e) {          t.read(e, function (e) {            a.dataReceived(e), r()          })        }        function r() {          t.read(8, function (i) {            var r = new DataView(i.buffer, i.byteOffset, i.byteLength), s = r.getUint32(0, !0);            if (s == e.ID_DATA) {              var c = r.getUint32(4, !0);              return void n(c)            }            return t.destroy(), s == e.ID_DONE ? void a.dataReceived(null) : void o()          })        }        if (!t)return void o();        var s = new ArrayBuffer(8), d = new DataView(s);        d.setUint32(0, e.ID_RECV, !0), d.setUint32(4, i.length, !0), t.write(s, function () {          t.write(c(i), function () {            r()          })        })      })    }, t.createSocketFactory = function (e) {      return {        newSocket: function (n, o) {          t.sendClientCommand({serialno: e, command: n}, o)        }      }    }, t.getOrCreateSockFactory = function (e) {      return e.socketFactory || t.createSocketFactory(e.serialno)    }, t.push = function (n, o) {      var i = n.file, r = (n.serialno, n.socket);      t.getOrCreateSockFactory(n).newSocket("sync:", function (t) {        if (!t)return void o();        var n = new ArrayBuffer(8), s = new DataView(n), a = i + ",0644";        s.setUint32(0, e.ID_SEND, !0), s.setUint32(4, a.length, !0), t.write(n, function () {          t.write(c(a), function () {            function n() {              r.read(function (t) {                if (t.byteLength > e.DATA_MAX) {                  var n = t.subarray(e.DATA_MAX);                  t = t.subarray(0, e.DATA_MAX), r.unshift(n)                }                i(t)              })            }            function i(o) {              var i = new ArrayBuffer(8), r = new DataView(i);              r.setUint32(0, e.ID_DATA, !0), r.setUint32(4, o.byteLength, !0), t.write(i, function () {                var e = o.buffer;                (o.byteOffset || o.length != e.byteLength) && (e = e.slice(o.byteOffset, o.byteOffset + o.byteLength)), t.write(e, function () {                  n()                })              })            }            r.onClose = function () {              var n = new ArrayBuffer(8), i = new DataView(n);              i.setUint32(0, e.ID_DONE, !0), i.setUint32(4, 0, !0), t.write(n, function () {                t.read(8, function () {                  o()                })              })            }, n()          })        })      })    }, window.Adb = t  }(), function () {    function e(e, t) {      this.transport = e, this.sockets = {}, this.currentSocketId = 0, this.maxPayload = t || AdbDevice.MAX_PAYLOAD    }    e.prototype.start = function (e) {      var t = c(e, void 0, !0);      this.sendMessage(AdbDevice.kCommandCNXN, AdbDevice.ADB_PROTOCOL_VERSION, this.maxPayload, t), this.receiveMessages()    }, e.prototype.fatal = function (e) {      console.log("fatal error", e);      var t = this.onClose;      t && (delete this.onClose, t())    }, e.prototype.sendMessage = AdbDevice.prototype.sendMessage, e.prototype.receiveMessages = AdbDevice.prototype.receiveMessages, e.prototype.onReceiveMessage = AdbDevice.prototype.onReceiveMessage, e.prototype.handleMessage = AdbDevice.prototype.handleMessage, e.prototype.handleUnknown = AdbDevice.prototype.handleUnknown, e.prototype.newAdbSocket = AdbDevice.prototype.newAdbSocket, e.prototype.destroy = AdbDevice.prototype.destroy, e.prototype.onOpenSocket = function (e, t) {      if (this.openSocket) {        var n = ++this.currentSocketId, o = this.newAdbSocket(n);        o.remoteId = t, this.sockets[n] = o, this.sendMessage(AdbDevice.kCommandOKAY, n, t), this.openSocket(s(e), o)      }    }, window.AdbDaemon = e  }(), function () {    function e(e, t, n) {      $.ajax({        url: e, dataType: "binary", responseType: "arraybuffer", success: function (e) {          var o = new Uint8Array(e), i = new b(o), r = "/data/local/tmp/apk" + (new Date).getTime() + ".apk";          Adb.push({serialno: t, file: r, socket: i}, function () {            Adb.shell({command: "pm install -r " + r, serialno: t}, n)          })        }, error: function (e) {          console.error("error fetching apk", e), n()        }      })    }    function t(e, t, n) {      Adb.shell({command: "pm path " + t, serialno: e}, function (e) {        if ("" == e || !e)return void n(null);        var t = e.match(/package:\/.*?[\r\n]/);        return t && t.length ? (e = t[0], e = e.replace("package:", "").trim(), void n(e)) : void n(null)      })    }    function n(e, t, n, o, i) {      i || (i = Adb.shell), Adb.shell({command: "ls -l /system/bin/app_process*", serialno: e}, function (r) {        var s = "/system/bin/app_process";        r && r.indexOf("app_process32") != -1 && (s += "32"), i({          command: 'sh -c "CLASSPATH=' + t + " " + s + " /system/bin " + n + '"',          serialno: e        }, o)      })    }    window.AdbUtils = {runMain: n, installApk: e, getApkPath: t}  }(), function () {    var e = function (e) {      this.authorization = e    };    e.prototype.shorten = function (e, t) {      $.ajax({        type: "POST",        url: "https://www.googleapis.com/urlshortener/v1/url?key=" + this.authorization,        data: JSON.stringify({longUrl: e}),        contentType: "application/json",        dataType: "json",        success: function (e) {          t(e.id)        }      })    }, window.Googl = e  }(), function () {    var e = 1, t = 1;    S.prototype.refresh = function (e, t) {      this.refreshInternal(e, t).async()    }, S.prototype.refreshInternal = function*(o, i) {      var r, s = function () {        n(function () {          if (this.a()) {            var e, t = chrome.app.window.getAll().filter(function (e) {              return e && "purchase" == e.id            });            t && t.length, e = t[0], null != e && (e.close(), m("Vysor subscription is active. Thank you for your support!"))          }        }.bind(this)), this.globalRefresh ? this.globalRefresh() : console.error("no global refresh?"), r || (r = !0, o && o(this.a()))      }.bind(this), c = !1, a = !1, d = !1, l = !1;      window.chrome && window.chrome.runtime && window.chrome.runtime.connect || (d = !0);      var u, h, f, p = function (e, t) {        return !!t.licensed && (e != t.email ? (console.log("email mismatch"), !1) : (console.log("enterprise license retrieved"), !0))      }.bind(this), v = function (e, t) {        if (t.sandbox != c)return console.log("sandbox mismatch"), !1;        if (e != t.buyer_id)return console.log("id mismatch"), !1;        if ("koushd@gmail.com" != t.seller_id)return console.log("seller mismatch"), !1;        var n = !1;        return t.subscriptions && $.each(t.subscriptions, function (e, t) {          return console.log("subscription found", t), t.remote_plan_id.startsWith("vysor") ? void(t.subscription_active && (console.log("clockwork subscription retrieved"), n = t.license_first_retrieved)) : void console.log("skipping non-vysor subscription")        }.bind(this)), $.each(t.orders, function (e, t) {          return console.log("purchase found", t), t.product_id.startsWith("vysor") ? void(t.is_purchased && (console.log("clockwork license retrieved"), n = t.order_date)) : void console.log("skipping non-vysor purchase")        }.bind(this)), n      }.bind(this), g = function (t) {        $.each(t, function (t, n) {          console.log("subscription status", n), "ACTIVE" == n.state && (console.log("chrome license retrieved"), e = !0)        }.bind(this))      }.bind(this), b = function*() {        if (l)return void console.log("skipping enterprise");        if (f && !i)return console.log("Skipping enterprise license server check."), void console.log("Use Retrieve License from the purchase page to force refresh.");        console.log("checking chrome enterprise licenses");        var n = yield w(!1, yield);        if (!n)return chrome.runtime.lastError, void console.error("No auth token for enterprise licensing");        try {          var o = yield chrome.identity.getProfileUserInfo(yield);          if (!R)return void console.log("unable to retrieve user info for enterprise");          var r = (o.id, o.email);          try {            var o = yield $.ajax({              url: "https://billing.vysor.io/license",              headers: {Authorization: "Bearer " + n},              dataType: "json",              success: yield y,              error: yield Error            }), c = JSON.parse(o.signed_data);            yield chrome.storage.local.set({cachedEnterpriseLicense: o}, yield);            var a = p(r, c);            if (!a)return void console.log("No enterprise license found on server");            e = !0, t = !0, s()          } catch (e) {            yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Error communicating with vysor enterprise", e)          }        } catch (e) {          yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Unable to get email for enterprise", e)        }      }.bind(this), k = function*() {        if (a)return void console.log("skipping clockwork");        if (h && !i)return console.log("Skipping clockwork license server check."), void console.log("Use Retrieve License from the purchase page to force refresh.");        console.log("checking clockwork purchases");        var n = yield w(!1, yield);        if (!n)return chrome.runtime.lastError, void console.error("No auth token for clockwork billing");        try {          var o = yield chrome.identity.getProfileUserInfo(yield);          if (!R)return void console.log("unable to retrieve user info for clockwork");          var r = o.id,            d = "https://billing.clockworkmod.com/api/v1/purchase/koushd@gmail.com?sandbox=" + c + "&nonce=" + Date.now();          try {            var o = yield $.ajax({              url: d,              dataType: "json",              headers: {Authorization: "Bearer " + n},              error: yield Error,              success: yield y            }), l = JSON.parse(o.signed_data);            yield chrome.storage.local.set({cachedClockworkLicense: o}, yield);            var u = v(r, l);            if (!u)return void console.log("no clockwork license found on server");            e = !0, t = !0, s()          } catch (e) {            console.error("error requesting purchases", e)          }        } catch (e) {          yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Unable to get buyer id for clockworkbilling", e)        }      }.bind(this), S = function*() {        if (!d) {          console.log("checking chrome store purchases");          var e;          try {            e = yield google.payments.inapp.getPurchases({              parameters: {env: "prod"},              success: yield y,              failure: yield Error            })          } catch (e) {            if (console.error("Failed to query license from chrome store.", e), !i)return console.log("Skipping Chrome license server fallback check."), void console.log("Use Retrieve License from the purchase page to force refresh.");            console.log("Falling back to server proxied query.");            try {              yield this.b(!1, yield), yield * I()            } catch (e) {              console.error("failed to do fallback server check", e)            }            return          }          if (g(e.response.details), !this.a())return void console.log("no chrome license found on server");          s(), console.log("Caching Vysor license."), yield this.b(!1, yield), this.c() && s()        }      }.bind(this), A = 4, D = A / 2, I = function*() {        if (!d) {          console.log("checking cached chrome license");          var e = yield chrome.storage.local.get("cachedLicense", yield);          if (!e)return void console.error("storage access failed?", chrome.runtime.lastError);          if (!e.cachedLicense)return void console.log("no cached chrome license found");          if (!R)return void console.log("unable to retrieve user info for cache");          var n = yield C("AQAB", "vMGBBmLcMO4lOmg-YAHq2DjZKHTaW-xs9KPNXU_zKJ7ZhFhWH3I6skF9ZO8lKeXOSwVEIW4HVMa7m16S6WTrUw", e.cachedLicense.signed_data, e.cachedLicense.signature, yield);          if (n)return void console.error("error verifying cached signature", n);          var o = JSON.parse(e.cachedLicense.signed_data);          u = !1;          var i = Date.now();          if ($.each(o.payments, function (e, t) {              "ACTIVE" == t.state && (u = !0, i = Math.min(i, t.createdTime))            }.bind(this)), o.date > Date.now())return void console.log("cached license date from future?");          var r, c = new Date - new Date(i), a = c / 1e3 / 60 / 60 / 24;          r = a < 14 ? 4 : Math.min(30, 4 + (a - 14) / 7);          var l = r / 2;          if (o.date + 24 * r * 60 * 60 * 1e3 < Date.now())return void console.log("cached license is expired.");          if (R.id != o.userinfo.id)return void console.log("id mismatch");          if (g(o.payments), !this.a())return void console.log("no chrome license found in cache");          if (console.log("cached license is valid for " + (o.date + 24 * r * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), o.date + 24 * l * 60 * 60 * 1e3 < Date.now()) {            console.log("Refreshing cached license");            try {              yield this.b(!1, yield)            } catch (e) {              console.warn("Failed to re-cache license.", e)            }          }        }      }.bind(this), L = function*() {        if (!a) {          console.log("Checking cached Clockwork license.");          var n = yield chrome.storage.local.get("cachedClockworkLicense", yield);          if (!n)return void console.error("storage access failed?", chrome.runtime.lastError);          if (!n.cachedClockworkLicense)return void console.log("Cached Clockwork payload not found.");          if (!R)return void console.error("Unable to retrieve user info for cached Clockwork license.");          var o = R.id,            i = yield C("AQAB", "vMGBBmLcMO4lOmg-YAHq2DjZKHTaW-xs9KPNXU_zKJ7ZhFhWH3I6skF9ZO8lKeXOSwVEIW4HVMa7m16S6WTrUw", n.cachedClockworkLicense.signed_data, n.cachedClockworkLicense.signature, yield);          if (i)return void console.error("Error verifying cached clockwork signature", i);          var r = JSON.parse(n.cachedClockworkLicense.signed_data), c = v(o, r);          if (!c)return console.log("No Clockwork license found in cache."), void(h = !0);          var d, l = new Date - new Date(c), u = l / 1e3 / 60 / 60 / 24;          d = u < 14 ? 4 : Math.min(30, 4 + (u - 14) / 7);          var f = d / 2;          if (r.timestamp + 24 * d * 60 * 60 * 1e3 < Date.now())return void console.log("Cached Clockwork license is expired. Requires server check.");          if (r.timestamp > Date.now())return void console.error("Cached Clockwork license date from future?");          e = !0, console.log("Cached Clockwork license is valid for " + (r.timestamp + 24 * d * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), r.timestamp + 24 * f * 60 * 60 * 1e3 < Date.now() && (h = !1, yield * k())        }      }.bind(this), O = function*() {        if (!l) {          console.log("Checking cached enterprise license.");          var n = yield chrome.storage.local.get("cachedEnterpriseLicense", yield);          if (!n)return void console.error("storage access failed?", chrome.runtime.lastError);          if (!n.cachedEnterpriseLicense)return void console.log("Cached Enterprise payload not found.");          if (!R)return void console.error("Unable to retrieve user info for cached Clockwork license.");          var o = yield C("AQAB", "hDuGsIhbjLYXteQX3F3KNriQHwUSZurS5voCkdpA1733A65pqtGOrk9g_yLiF94_vSK0VmL-4stq7WAYEbn6nw", n.cachedEnterpriseLicense.signed_data, n.cachedEnterpriseLicense.signature, yield);          if (o)return void console.error("Error verifying cached enterprise signature", o);          var i = JSON.parse(n.cachedEnterpriseLicense.signed_data), r = p(R.email, i);          if (!r)return f = !0, void console.log("No Enterprise license found in cache.");          if (i.timestamp + 24 * A * 60 * 60 * 1e3 < Date.now())return void console.log("Cached Enterprise license is expired. Requires server check.");          if (i.timestamp > Date.now())return void console.error("Cached Enterprise license date from future?");          e = !0, console.log("Cached Enterprise license is valid for " + (i.timestamp + 24 * A * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), i.timestamp + 24 * D * 60 * 60 * 1e3 < Date.now() && (f = !1, yield * b())        }      }.bind(this);      if (this.a())return void s();      console.log("starting license check");      var R = yield chrome.identity.getProfileUserInfo(yield);      R ? console.log("user info", R) : console.log("unable to retrieve user info"), yield * O(), this.a() || (yield * L(), this.a() || (yield * I(), this.a() || (yield * b(), this.a() || (yield * k(), this.a() || (yield * S(), this.a() || s())))))    }, S.prototype.b = function (e, n) {      console.log("caching chrome license"), w(e, function (o) {        return o ? void $.ajax({          type: "post",          url: "https://billing.clockworkmod.com/api/v1/verify/google/koushd@gmail.com",          data: {token: o, item: chrome.runtime.id, version: chrome.runtime.getManifest().version},          dataType: "json",          success: function (e) {            console.log("chrome license cached"), t = !0, chrome.storage.local.set({cachedLicense: e}, n)          }.bind(this),          error: function (e, t) {            console.error("unable to cache license", t), chrome.identity.removeCachedAuthToken({token: o}, function () {              n && n(t)            })          }        }) : (chrome.runtime.lastError, e && m("Unable to get auth token: " + chrome.runtime.lastError), console.error("Unable to get auth token while caching license", chrome.runtime.lastError), void(n && n(chrome.runtime.lastError)))      }.bind(this))    }, S.prototype.a = function () {      return e    }, S.prototype.c = function () {      return t    }, S.prototype.startPurchase = function () {      chrome.app.window.create("purchase.html", {        id: "purchase",        innerBounds: {minWidth: 800, minHeight: 860}      }, function (e) {        this.refresh(), e.contentWindow._rlm = function (e) {          chrome.storage.local.remove(["cachedLicense", "cachedClockworkLicense", "cachedEnterpriseLicense"], function () {            this.refresh(e, !0)          }.bind(this))        }.bind(this)      }.bind(this))    }  }(), A.prototype.openSocket = function (e, t) {    if (!this.onOpenSocket || !this.onOpenSocket(e, t)) {      if ("properties" == e) {        var n = this.properties;        return void t.write(c(n), function () {          console.log("sent properties", n), t.destroy()        })      }      this.adbSocketFactory.newSocket(e, function (n) {        return n ? void Socket.stream(n, t, function () {        }) : (console.log("unable to execute adb proxy command?", e), void t.destroy())      })    }  };  console.log("Vysor version", chrome.runtime.getManifest().version), console.log(navigator.userAgent), console.log("Electron", isElectron());  var Se, Ae, De, Ie = new AdbServer({start: !1}), Le = {}, Oe = {}, Re = {}, Ee = analytics.getService("vysor_app"),    Ue = Ee.getTracker("UA-4956323-6");  if (isElectron()) {    var Te = Ue;    Ue = {sendEvent: Te.sendEvent.bind(Te), sendAppView: Te.sendAppView.bind(Te)}  }  var We = new S, Pe = "Chrome GCM Service is unavailable. Try restarting Chrome?", Me = new HttpServer;  We.globalRefresh = function () {    console.log("license global refresh");    var e = chrome.app.window.getAll();    for (var t in e)t = e[t], U(t)  }, chrome.identity.onSignInChanged.addListener(function () {    console.log("onSignInChanged, refreshing license"), We.refresh(null, !0)  }), chrome.storage.local.get("keyboard", function (e) {    Se = e.keyboard  }), chrome.storage.local.get("vysorHttp", function (e) {    function t() {      Me.listen({port: n.port || 0, address: "127.0.0.1"}, function (e, t) {        console.log("http request", e.path);        var n, i;        for (var r in o)if (n = e.path.match(r), i = o[r], n)break;        return n ? void i(e, t, n) : (t.code(404), void t.write("", function () {        }))      }, function (e) {        return e ? (console.error("http server failed to listen", e), void(n.port && (console.log("trying port 0"), n.port = 0, t()))) : (n.port = Me.socket.localPort, console.log("vysor http port: " + n.port), void chrome.storage.local.set({vysorHttp: n}))      })    }    if (!e)return void console.error("unable to start vysor httpServer, no dict");    var n = e.vysorHttp || {};    n.password = n.password || Math.round(Math.random() * (1 << 30)).toString(16);    var o = {      "/device/(.*?)/screenshot.jpg": function (e, t, n) {        var o = n[1], i = chrome.app.window.get(o);        if (!i)return console.error("device window", o, "not found"), t.code(404), void t.write("", function () {          t.end()        });        var r = i.contentWindow.password, s = Adb.createSocketFactory(o);        s.newSocket("tcp:53516", function (e) {          if (!e)return console.error("no socket", o, "for screenshot"), t.code(404), void t.write("", function () {            t.end()          });          t.headers.Connection = "close", t.headers["Cache-Control"] = "no-cache";          var n = new HttpRequestParser(null, e, function () {            var e = n.body.buffer.slice(n.body.byteOffset, n.body.byteOffset + n.body.byteLength);            t.write(e, function () {              t.end()            })          });          e.write(c("GET /screenshot.jpg?password=" + r + " HTTP/1.1\r\nConnection: close\r\n\r\n"), function (e) {          })        })      }, "/device/(.*?)/sdcard-vysor/(.*)": function (e, t, n) {        var o = n[1], i = n[2];        t.headers.Connection = "close", t.headers["Cache-Control"] = "no-cache", t.headers["Content-Type"] = "application/binary", Adb.pull({          file: "/sdcard/vysor/" + i,          serialno: o,          socket: t        }, function () {          t.end()        })      }, "/device/(.*?)/video.flv": function (e, t, n) {        var o = n[1], i = chrome.app.window.get(o);        if (!We.a())return console.error("ignoring request, not licensed"), t.code(402), void t.write("This feature is only available in Vysor Pro", function () {          t.end()        });        if (!i)return console.error("device window", o, "not found"), t.code(404), void t.write("", function () {          t.end()        });        if (!i.contentWindow.siphonFlv)return console.error("siphonFlv", o, "not found"), t.code(404), void t.write("", function () {          t.end()        });        var r = new b;        if (t.headers.Connection = "close", t.headers["Content-Type"] = "video/x-flv", Socket.pump(r, t, function () {            console.log("flv source closed")          }), isElectron()) {          var s = r;          r = {            dataReceived: function (e) {              s.dataReceived(e)            }, destroy: s.destroy.bind(r)          }        }        i.contentWindow.siphonFlv(r)      }    };    t()  }), We.refresh();  var Ne;  chrome.app.runtime.onLaunched.addListener(function (e) {    G(), e && "vysor_purchase" == e.id && We.refresh(null, !0), e && "vysor_presentation" == e.id && Z(e.url, function (e) {      K(e)    }), e && "vysor_device_farm" == e.id && (console.log("device farm", e.url), De && De.show(), G(), m("Vysor is connecting to shared Android devices"), w(!0, function (t) {      return t ? void Y(e.url, t, function (e, t) {        return t ? void T("Vysor Share", "Unable to connect to shared devices. " + t) : void T("Vysor Share", "Connected to " + e.name + "'s remote devices.")      }) : void m("Unable to get auth token")    })), ee()  });  var _e, xe;  Y = re(Y), X = re(X), oe = re(oe), Z = re(Z), chrome.storage.local.get("share-all-devices", function (e) {    e["share-all-devices"] && X(!1, function () {      P()    })  });  var Fe, Be, Ve, je, Ke, qe, He, Je = {}, Ye = {}, $e = {}, Xe = {}, ze = {};  me(), ve();  var Ge;  chrome.runtime.onUpdateAvailable.addListener(function () {    V()  }), chrome.notifications.onButtonClicked.addListener(function (e, t) {    "reload" == e ? chrome.runtime.reload() : "never-start-automatically" == e && (chrome.storage.local.set({"connect-automatically": !1}), chrome.notifications.clear(e))  }), chrome.notifications.onClicked.addListener(function (e, t) {  }), t[""] = e}({}, function () {  return this}());