PageSourceSearch

https://c3-static.comparably.com/1.576/comparably/js/jquery-oauthhelper.js?1.576

js comparably.com collected 2026-10-01 07:13:04 UTC 16,275 bytes, 189 lines download raw bytes

1var OAUTH_LOADING_GIF = "data:image/gif;base64,R0lGODlhQAAMAKIAANPU1ouOlP///x4mMOvs7MzO0MrMz8/Q0yH/C05FVFNDQVBFMi4wAwEAAAAh+QQECgAAACwAAAAAQAAMAAADeSga0xMqykkJuIDQvS3WEeGMA8htwKGuwHmm" +
2                        "q9oqJOlScCzfU663jJoDwhMQdDrT7YhciYSjosCHnPGoP2i0iI1Zb12W1iEN77hN8XhQTp+v7gMgCCXymGmlC9/UjKUKYV9wTTNPNXqEXoARWIN0D4wSHheJUpQZEQkAIfkEBAoAAAAsAAAAACYADAAAA00oat" +
3                        "FhKspJw7gjSOJ6IFQYEVg5gILniaJpCozqQKxkuZis1hJu6h1exFcCOoQKYs6oQSovMR1NePNpjMghUcGRobIk3BfWmWYj1UwkAQAh+QQECgAAACwAAAAAQAAMAAADgyhKcAdEyUmrCTiYynkY4BBQQGGeQKcS" +
4                        "WRtEakWE9ACXZ57GlOvylFpNQMgZCzBgwdcqABUfYSiAO5p2QObvKa1Zc4enQNsSd2nfU/hJzpjPoKoVy2tj3vBiOsm7kDdscCNyOmJQZIYCcBKEBXRPLEx8QDNSfAwOEIkTfhiAm2M0IwoJACH5BAQKAAAALB" +
5                        "oAAAAMAAwAAAMjKErQQCqCQyuQNZ9LtGZe1oTWRG4m+ZwHlGqX8lJxxDiQkgAAIfkEBAoAAAAsNAAAAAwADAAAAxsoatFhShFHA1G1ipIp72Aojg0TQqIEXpFZRgkAIfkEBDIAAAAsNAAAAAwADAAAAyMoStBA" +
6                        "KoJDK5A1n0u0Zl7WhNZEbib5nAeUapfyUnHEOJCSAAAh+QQECgAAACw0AAAADAAMAAADGiga0xNKEUcHUbUKlh3vYCiOjwiJEnhF3xMlACH5BAQKAAAALBoAAAAmAAwAAANPKBrTEyrKSU24wUji+iBUGBFYGY" +
7                        "CC54miaQqM6kCsVLhlIa91hJu7Ts/3wwQdw0XxcmwkYUtmkDa0FDXHp/Kn4MhQTxIODOtQtQrrRaNIAAAh+QQECgAAACwAAAAAQAAMAAADgCga0xMqyklNuMHQvQn4ACERTjmIXIetAZpSwCHPQGSaL8Wy+RTP" +
8                        "wBrj5oD0BIXdqnAUEIDQA4lYaip5x19UBqBWj9dVU7vtehvW8GW8pZ3RYLWxR44ChtR5zhLWHJ9tUgJnTQthhQJ1NApTNy5/V49ZdhN4D4gSfBd+mE4gIREJACH5BAQKAAAALAAAAAAmAAwAAANVKGrRYSrKSQ" +
9                        "m4gEjietBUGAFHaQKR54kiab4oozoQu734wc2dLbm5EoDX8ymAwSGxYTwGT0tmE5kDyHg1I+FZ0iyboydKsFOBwALqYRy5PtATC+acAAAh+QQEMgAAACwAAAAADAAMAAADIyhKcAdESVCqBdPqgsnezKdRonWU" +
10                        "JllCaBGpG6bAlSwxDiQlADs=";
11var OAUTH_COMPARABLY_LOGO = "data:image/gif;base64,R0lGODlhuAAhAKIAAJydoGBjaM3Oz////xcfKTY7Qt7f4O/w8CH5BAAAAAAALAAAAAC4ACEAAAP/OLrc/jDKSau9WJG9xeVdJo5kaZ4ZSHiWyqIHAARcEAAvqu/8B+YTF0pA" +
12                        "U6kOvaRyORC2fieA0RhgWq8lZ0U7kk5VAKx4TOEGoSQv6CZoC2ZAspxsltQtAlUhPO/7G3cQgRRFGwUGGDEBBRtsghweb4x7SApvhgCVDCBhiow3mgwxMzU4D5wDMYwso4WODkKSBDeIsFCFsw0GLnmoFwCMUw" +
13                        "GhGpBqHIcDx4a1C5wGwSAFQMtgxM/RHtWc1z+4HHybUL0czcrS5yDEEtvS3Y1fN/GANdFGOe3g9BukkOlfBMIVQwZQYBMoB+wJPBYGl0F2Kmx8qyIOoEV/zi4i07Rr/5aMfhgHzhLS8YaMbzmmFFhkJJSTYxQV" +
14                        "2POg0EJCXwPIhcjIqY09fj5xHnyWatlCYgwrSrPBIlODpDz1KTCqdIWCjhwqYc01lJ8FmE/XVA2nM+ACnTG7cl2AK+0DtFXNUoAbVe4CsHVfOJzqC4yFvQzKVtV04MiCwiCqAhGsa8a3DWMjGHA8RXGDspq06O" +
15                        "RzrBZgCjNthVSxD3JVy6UJNCNyEfXlx6Tzit6p9sXNrAOixTxW4ElI2SIJpB4OHHXZL67PahRevDiXYwK2hqNaBk3VZrHrEg8eRwWismwYc78cEYf42rMJZLY+QPoxwnrMQfhsKbva7cGT54wNNX/zf/923fff" +
16                        "eWa4ooZby0wzAV53CWWfgNrVZRBeoSmAGAf6VZiKfRE1QJ8ZOmXTwG1rmNcGHBb6VR97D7aYWF12LcOCigAyN15kfL0YXECITMaFGSSq4wA0y02nhw0dnqZkhDvOwpJYCnxzkhH6SQkShjAC5FYd1Tx0FWw0Dg" +
17                        "BmDe+YxqR/Taq02nI2ohcYm0qNWUCZVulyTwSqWIRgQeu4iOWZYAgj3zYy6OgmA4QeoxQOwvTJHltQSnDAG23R4oAipayD5qYQ1jYZDa84IEtA2oCA3aOWAAMUgKeG8KlHcdzoIap/8DBIrX4wiGsSt+5Khoy+" +
18                        "KtFrsExgGimxOwyLbBIlF260rK20PmsFLslIq4Oy1upwoKbZioBttybkYQq45JY74gUJAAA7";
19var OAUTH_LINKEDIN_LOGO ="data:image/gif;base64,R0lGODlhhwAkAKIAAAMDA////wBlmFJSUs/T1iF6ppqamoSz0CH5BAAAAAAALAAAAACHACQAAAP/GLrc/jDKSWs8JevNu9+HJY5kaQaEoK5s675ucc50XR1wrr+y7f813G6o6wG" +
20                         "PyBtxyUs6nw4hcyooGK5XwoQwAAwMMwL2CnWIxw2pqkBoq6mrAmA+B0vo9VMXX24Y8ABaC2pGCgVwLXJ4dhAEgAN6eJB9C394ggpqIQxvcIp0jA+OkpF0k5QBlnSYAZppiCyfeRJ7c6wjtV6oCqq2nC2sh7Br" +
21                         "gKEQBgMDt7iku72Bv7EHBBjDccWouacWbW0V3byArJ3WMdgS3d4K6ZhnBrfaDMjJ9Atcj8b22m3i0XEb/wBWOUBQmLlFE7CNWrUQFIN44fqlAtRMHsU5uaANitVA/9g4AbcIGLyG8A7ChgCemVoAEaXGjBS3w" +
22                         "bzoa2OcjipYqWsgMtG5CAppXrQDMaOgZ1jOuRSqMRNHBh65+SwJ9CRNmJPiIV0gEUWzjMpQwPx4E2pOUQ9GykqZ0KpSigr2/exlLBe/inG7tnq6IConvzaJUYUQFO8zLdpyhVI8Btmiw370EsIJkkGKsoGr/C" +
23                         "TsdpXlfjM9s2Ra7JkDyJkLBQC8lwVZwQ5NOkSpEzRpBqSLQbR4yV8Vyq/Ppt78oLDodbaZnsq9aHclyXwNCXfq2vfafA2M10TeG2xGoo8bjxGjd2Lv1MB9Vx4+uHjn7V6796OIuP1p4katp8+8njpsU8v0BDi" +
24                         "Jdk3F5xlEz0CCEna4zUWffmb119oKwa3FlAIE1ibfSnkh5B0WyQAw2iMhPohehMFJSAhzc2D4XoG0BbCbS3eRJshSQlW4n3/TTagZiy7OpleMzoFloFCM4JiSXRD21eMbFbIoYgAZftZbL9u4BAZ5V+kEExhM" +
25                         "nuikisBYx86Z6ayTpprg8LTmmW6yY1ljO/GEDBls1uljFQLx2ecaHES3y6AlkFOOoIQmqsShOaim6KMXMNoopJSiIykMjlaqaSsfdOppBwEkAAA7";
26var OAUTH_FACEBOOK_LOGO ="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAKL2lDQ1BJQ0MgcHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8Q
26FGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3" +
27                        "IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcR" +
28                        "APEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2C" +
29                        "hRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgac" +
30                        "A1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDR" +
31                        "Gzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlh" +
32                        "rlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/" +
33                        "NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/vMO7xsAAAAb1BMVEU7V53////n6vIyUZofRJSHlL0lSJbe4ew1U5trfbE4VZzO0+Pz9fknSpdBXKAwT5rY3Om7w9mfqspdcaqBkLyqtNEbQpRxg7SQncK4wNiWosaMmcHv8fdjdq1MZKTJz+IAMo2yu9VUa6ilr854iLd4bKh8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AMfAgY04SALZgAAAL9JREFUWMPt2cEKwjAQhOEdUqINTRbBg6DQ939LES9tUdq6Q/Ew/wN80EPm0DWguZHyBhiKESuwZtSaORckc0odmN8x7RTk6g2LYt4AMMEOoIIfvQB4Bhf84v0OXtkgyGBmgw82uGAuOdd3HLALT0KaeTm+MXXq9YTRmj27ygadDSaBAo8EsV5lg4kMDuxPHtlgzwYzG3Q2aAKj4Kj5EihQoECBAgX+D+hc0Hf8ut8Eth3HhS1ggW0/f6yDr/PHE8k/CLR1iHW4AAAAAElFTkSuQmCC";
34
35
36
37
38function oauthResults(results){
39    if(results.error == "AlreadyConnected"){
40        $.alert([{ key: "xer", value: "The account your are trying to use is already connected to a different user", level: "error" }]);
41    }
41else if(results.error == "NotConnected" || results.error == "UserCancelled"){
42    }else if(results.error){
43        $.alert([{ key: "xer", value: $locale["_form_unexpected_error"], level: "error" }]);
44    }
45    $(window).trigger("oauthcallback", results);
46}
47
48$.initiateOAuth = function(props, cb){
49    var mode = 'initiate';
50    if(props.createuser) mode += ';initiate-create';
51    if(props.forcelogin) mode += ';initiate-forcelogin';
52    var openOauth = true;
53    var options = {
54        fallback: props.fallback,
55        name: props.name
56    }
57    switch (props.name) {
58        case "google":
59            function doAuthGoogle() {
60                if ($.isEmbedded && (/Teams/i.test(navigator.userAgent) || $.isHandheld)) {
61                    $.alert({
62                        message : "Please finish setting up your account via the MS Teams Web Portal using your web browser and going to https://teams.microsoft.com/",
63                        buttons : [
64                            {text: "OK", styleClass:"button button-medium reverse hollow no-hover", id:"CANCEL"}
65                        ],
66                    });
67                } else {
68                    gapi.auth2.authorize({client_id : $objects["GoogleClientID"] || props.client_id || "837323687601-093r166amt5frv141597ff96mqpnk231.apps.googleusercontent.com",scope:"email profile openid",response_type: 'id_token permission',ux_mode: 'redirect'}, function(response) {
69                        if (response && response.error) {
70                            switch(response.error) {
71                                case "popup_closed_by_user":
72                                    break;
73                                case "popup_blocked_by_browser":
74                                    $.alert([{ key: "xer", value: "Google Login Popup was blocked by your browser. Please try again.", level: "error" }])
75                                    break;
76                                case "access_denied":
77                                    $.alert([{ key: "xer", value: "Please Grant Comparably permission to continue", level: "error" }])
78                                    break;
79                                case "idpiframe_initialization_failed":
80                                    $.alert([{ key: "xer", value: "Please allow third-party cookies to continue", level: "error" }])
81                                    break;
82                                case "immediate_failed":
83                                default:
84                                    $.alert([{ key: "xer", value: $locale["_form_unexpected_error"], level: "error" }]);
85                                    break;
86                            }
87                            return cb();
88                        } else if (!response || !response.access_token || !response.id_token) {
89                            $.alert([{ key: "xer", value: $locale["_form_unexpected_error"], level: "error" }]);
90                            return cb();
91                        }
92                        $.submit(props.authorizeURL || $routes.thirdparty.google_oauth.getURL(),{token:response},function(e,results){$(window).trigger("oauthcallback", results);});
93                    });
94                }
95            }
96            if (gapi.auth2) {
97                doAuthGoogle();
98            } else {
99                gapi.load('auth2', doAuthGoogle);
100            }
101            openOauth = false;
102        break;
103        case "linkedin":
104            options.collectURL = $routes.thirdparty.linkedin_oauth.getURL(mode);
105            options.logo = OAUTH_LINKEDIN_LOGO;
106        break;
107        case "facebook":
108            options.collectURL = $routes.thirdparty.facebook_oauth.getURL(mode);
109            options.logo = OAUTH_FACEBOOK_LOGO;
110        break;
111    }
112    if (props.funnelId && options.collectURL) {
113        options.collectURL += (!~options.collectURL.indexOf('?') ? '?' : '&') + 'funnelId=' + props.funnelId;
114    }
115    if(openOauth){$.__openOAuthPopup(options, cb);}
116
117    $(window).unbind("oauthcallback").bind("oauthcallback", function(e, results){
118        $(window).unbind("oauthcallback");
119        cb(results, props.name);
120    });
121};
122
123var oauthWindowCheck = 0;
124var oauthWindow = null;
125
126
127$.__openOAuthPopup = function(options, cb){
128    /* check for previous oath calls */
129    if(oauthWindow){
130        try{
131            oauthWindow.close();
132            oauthWindow = null;
133            $(window).trigger("oauthcallback", {cancelled:true});
134        }catch(e){
135        }
136    }
137
138    oauthWindow = window.open('about:blank','_blank','location=yes,height=300,width=680');
139    try {
140        if (typeof oauthWindow == 'undefined' || (oauthWindow && oauthWindow.closed))
141            oauthWindow = undefined;
142    } catch (e) {
143        oauthWindow = undefined;
144    }
145
146    if(!oauthWindow) {
147        if (options.fallback) {
148            options.fallback.name = options.name;
149            window.location.href = options.collectURL + (!~options.collectURL.indexOf('?') ? '?' : '&') + 'fallback=' + JSON.stringify(options.fallback);
150        } else {
151            $.alert({ title: '', message: 'In-App Browser does not support authentication via <i>' + options.name + '</i>. Please authenticate via email or authenticate via ' + options.name + ' using the <b>Default Browser</b>.'});
152        }
153        return;
154    }
155
156    clearInterval(oauthWindowCheck);
157    oauthWindowCheck = setInterval(function(){
158        if(!oauthWindow || oauthWindow.closed){
159            oauthWindow = null;
160            clearInterval(oauthWindowCheck);
161            $(window).trigger("oauthcallback", {cancelled:true});
162        }
163    },100);
164
165    try{
166        var doc = oauthWindow.document;
167        var w = "<html><head><title>Connecting...</title><style>" +
168                    "*{font-family: 'lucida grande' ,tahoma,verdana,arial,sans-serif;color: #DDD;font-size: 14px;}" +
169                    "a{text-decoration:none;}" +
170                    "a:hover{text-decoration:underline;}" +
171                    "p{border-radius:4px;-moz-border-radius:4px;-webkit-border-radius:4px;background:#FFF;text-align:center;padding:60px 0;clear:both;margin:20px 0;}" +
172                    "body{padding:5px;background:#171f29;text-align:right}" +
173                    "h1{float:left;color:#f6f6f6;font-size:17px;margin:0;padding:0;text-shadow:0 2px 3px #000;}" +
174                    "span{display:inline-block;margin:0 20px;height:80px}" +
175                    "span.thirdparty{width:200px;background:url('" + options.logo + "') no-repeat 0 50%;}" +
176                    "span.loadingicon{width:64px;background:url('" + OAUTH_LOADING_GIF + "') no-repeat 50% 50%;}" +
177                    "span.site{width:200px;background:url('" + OAUTH_COMPARABLY_LOGO + "') no-repeat 100% 50%;}" +
178                    "</style></head><body>" +
179                "<h1>Initiating Connection...</h1>" +
180                "<a href=\"javascript:self.close()\">Close</a>" +
181                "<p><span class=\"site\"></span><span class=\"loadingicon\"></span><span class=\"thirdparty \"></span></p>" +
182                "<a href=\"" + options.collectURL + "\">Click here if nothing happens</a>" +
183                "<scr" + "ipt>setTimeout(function(){location.href='" + options.collectURL + "';},500);</" + "scri" + "pt></body></html>";
184        doc.write(w);
185        doc.close();
186        return;
187    } catch (e) {
188    }
189};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.